程序开发中异常的理解及处理异常论文

时间:2022-07-01 05:45:08 论文 收藏本文 下载本文

程序开发中异常的理解及处理异常论文(推荐14篇)由网友“王豆豆王贫困”投稿提供,下面是小编整理过的程序开发中异常的理解及处理异常论文,欢迎大家阅读分享借鉴,希望对大家有所帮助。

程序开发中异常的理解及处理异常论文

篇1:程序开发中异常的理解及处理异常论文

程序开发中异常的理解及处理异常论文

从接触异常开始我就弄不明白她,不会用她,想在系统中是异常机制发挥的淋漓尽致,进行了很多尝试,利用异常控制程序流程,利用异常做数字的判断函数,利用异常消除系统中可能出现的恼人的异常提示框,为了更好了利用异常看了很多关于异常的文章,直到有一天看到了一句话——“永远不要去处理你不知道怎么处理的异常”,这才恍然大悟,感觉自己一直在用强大的异常机制干一些旁门左道的是事,更谈不上理解异常在程序中的地位和意义,异常其实一种报告机制,“她以一种不可回避的方式报告程序中所出现的问题”,她帮助程序员走向正确的道路,她忠实的向程序员提供错误报告,她希望有谁能重视并处理掉她报告的问题,哈,真不敢想象,没有了异常机制该如何编制高质量的程序!下面就个人的理解和看法瞎说几句,敬请各位批评指正,不胜感激!

异常的工作原理,在有问题的地方产生异常,马上停止当前的工作,转向异常处理代码,如果找不到异常处理代码,就会见异常向一层汇报,上一层接到异常会做同样的事,转向异常处理代码,或者再将异常向上汇报,这样逐层间错误传递出去,直到有一层处理了异常或是一直报告给程序的使用者——用户。这个层就是调用栈,当用户A运行程序B,B从函数C开始执行,调用函数D,再调用函数E,再调用函数F,这时F出现了异常,那么这个异常的调用栈就是A(栈底)—〉B—〉C—〉D—〉E—〉F(栈顶),这个异常就会沿着这个栈从栈顶开始向栈底的方向报告,如果在函数C中有对这个异常的处理代码,那么这个异常的报告链就是F—〉E—〉D—〉C。可以看出,如果在完整的调用栈中没有处理这个异常的代码,用户A就成了异常报告的终点,向windows界面系统,会弹出一个恼人的消息对话框哈。

那么用户A向谁报告呢,哈哈,这个已经不属于程序的范围了,感觉用会对程序而言好像上帝一样,诉说痛苦已经让上帝都听到了,就心满意足了哈哈,看来程序真虔诚哈哈。对于异常这个特性,也可以比喻成下属向上级报告问题,如果下属知情不报,问题就严重了,你要是领导知道下属是这样的八成就踢了他,相反如果你有一个报告机制健全的下属队伍,哈哈你就威风了。日本企业文蛤中有个宗旨——联络,商谈,报告,其实就是想让员工都具有向上级汇报的习惯。现在再看看程序,哈哈,你不用给她们灌输什么企业文化,不用她们讲述什么报告的重要性,她们本身就是忠实报告的,如果把程序员比作企业老总,那么程序就是训练一队有素的`员工。

怎样处理异常。在这里有个原则就是“永远不要去处理你不知道怎么处理的异常”,

也就是只处理你知道如何处理的异常,对那些你不知道的异常必须广开言路,并积极地向上级汇报。什么叫知道如何处理呢?先说一下处理异常有哪些方式,大体有,弹出提示消息框(这个消息框不同于那个恼人的异常报告消息框,她是捕获异常后,根据处理的具体环境程序员主动编写的友好的提示消息框),记录错误日志,吞掉,做善后工作等等,那么出现异常时就要站在出现异常的模块的立场上考虑一下我应该选择哪种处理方式呢?如果不能做出选择就选择不处理,即向上级报告。

举个例子,函数Fun1是创建并返回一个活动的数据连接对象的方法,他接受一个数据库连接字符串,如果调用者(上级)给他一个错误的连接字符串,这时Fun1创建不了连接对象,产生了一个创建不了连接对象的异常,那么这时他应该怎样处理这个异常呢?弹出友好的消息框?说什么友好,Fun1根本就不知道是什么原因使他接收到了错误的连接字符串,弹一个“连接字符串有误”,用户肯定都有杀你的心,这个提示和用户的业务逻辑有嘛关系!记录错误日志,这个还行,但是记录下来的文字无非就是“连接字符串有误,连接字符串是:SQL……”,好点的话,从连接字符串中看出了问题,一般情况下还得根据代码上下文去找问题原因。这个方式不是不行是不好。吞掉,哈哈开什么玩笑,你既创建不了连接,又不吱一声,想让调用者疯了呀,这个肯定不行。做善后工作,行,确实应该清理一下现场,免得浪费资源,但是还是没吱一声,所以这个方式做的不彻底。没招了,哈,其实上面的分析给我们指明了一条路,帮助我们祛除了错误的选择,这条路就是向上汇报,或是不加任何出来代码,或是记录日志,做些善后,再重新将异常抛出。

那么什么时候就知道怎样处理异常了,这就得看实际的情况和用户的要求了,这句话等于没说,就像其他的标题醒目但给出的结论却模棱两可文章一样,哈哈,这里可以给几个建议,

1,一般地,底层模块或是方法中不要处理异常,

2,编写公共模块、DLL等是,不能采用弹出对话框等依赖于平台,框架的方式处理异常,

3,编写公共模块、DLL等时,必须在使用文档中注明每个方法属性可能抛出的异常。

4,永远不要写   try 这样的语句。

{   }  catch(Exception)  {  o nothing  } 自定义异常。明白了异常的原理和机制后,就可以自己定义异常了,这样的实践往往在编写控件、公共模块、DLL等的时候,用错误编号在网上搜索一下,能找出一大堆关于错误代码的描述。其中大多数是M(icro)S(oft)制定的,MS 从操作系统到各种各样的框架都有对各种异常的编号,对每种异常做出了详细的定义,如果你还用过像Spread等商业控件,也可以看到他里边的各种各样的异常定义,也就是说我们自己也可以定义异常,在必要的时候,这样就可以让自己写的模块也加入到训练有素的员工队伍中了。至于如何定义异常,具体的编成语言有具体的做法,比如C#中指定一异常一个从Exception继承来的类,VB中异常是个全局变量等等,参见感兴趣语言的语法指南就可以了。

对异常的重新认识,一直以来许多人都认为异常是非常可怕的,可恶的,她是错误的化身,她有恼人的弹出对话框,弄得用户跟凶煞恶神似的哈哈,其实这些都是误解,异常一直默默地忠实的报告着程序中出现的严重的不可回避的问题,她为了程序、系统的正确性、严谨性呼唤你,希望你重视这些问题,希望你用智慧解决这些问题,她是多么的可爱,又是多么的高尚,从来没有因为对她的误解而放弃自己的使命……异常很重要,我们更好学会如何去使用她。

篇2:浅析Lua编程中的异常处理

这篇文章主要介绍了浅析Lua编程中的异常处理,是Lua入门学习中的基础知识,要的朋友可以参考下

需要进行错误处理

错误处理是必要的,因为真实世界中的操作通常需要使用复杂的操作,包括文件操作,数据库事务和web服务调用,没人关心错误的业务,涉及保密信息或金钱交易时造成大的损失。

在任何编程,总是有错误处理的要求。错误可以是两种类型,其中包括,

语法错误

运行时错误

语法错误

因使用不当造成的各种程序组件,如运算符和表达式中出现语法错误。一个简单的例子中的语法错误如下所示。

代码如下:

a == 2

如你所知,有使用单一等于和双等于之间的差异。使用一个替代其他可导致错误。等于是指分配,比较。同样,表示和有其预定实施这些方式的功能。

另一例为语法错误如下所示。

代码如下:

for a= 1,10

print(a)

end

当我们运行上面的程序,会得到下面的输出。

代码如下:

lua: test2.lua:2: ‘do‘ expected near ‘print‘

语法错误更容易处理程序不是运行时错误,因为,Lua解释更清楚地定位误差比的情况下运行时错误。从上面的错误,我们可以很容易知道,添加do语句之前print语句,每个Lua结构所需要的。

运行时错误

如果运行时错误,程序执行成功,但它可能会导致在输入或处理不当,功能运行时错误是由于错误。一个简单的例子来显示的运行时间误差如下所示。

代码如下:

function add(a,b)

return a+b

end

add(10)

当我们建立的程序,它会成功地建立并运行。一旦运行,它会运行并显示一个运行时错误。

代码如下:

lua: test2.lua:2: attempt to perform. arithmetic on local ‘b‘ (a nil value)

stack traceback:

test2.lua:2: in function ‘add‘

test2.lua:5: in main chunk

[C]: ?

发生因不是通过两个变量的运行时错误。 b参数的预期值是nil,并产生一个错误。

维护和故障功能

为了处理错误时,我们经常使用的两个函数断言和错误。一个简单的例子如下所示。

代码如下:

local function add(a,b)

assert(type(a) == “number”, “a is not a number”)

assert(type(b) == “number”, “b is not a number”)

return a+b

end

add(10)

当我们运行上面的程序,会得到下面的错误输出,

代码如下:

lua: test2.lua:3: b is not a number

stack traceback:

[C]: in function ‘assert‘

test2.lua:3: in function ‘add‘

test2.lua:6: in main chunk

[C]: ?

错误error (message [, level])结束最后一个被叫保护功能,并返回信息的错误消息。这个函数的错误不会返回。通常情况下,错误增加了约在邮件的开头错误位置的一些信息。level参数指定如何得到错误的位置。级别1(默认值),错误位置是误差函数被调用。 2级分错误的地方调用错误的函数被调用等等。传递一个0级可避免增加错误的位置信息的消息。

pcall和xpcall

在 Lua 编程,以避免引发这些错误和处理错误,需要使用的功能 pcall 或 xpcall。

pcall (f, arg1, ...)函数调用保护模式所要求的功能。如果函数f 出现了一些错误,但不会引发错误。它只是返回错误的状态。使用pcall 一个简单的例子如下所示。

代码如下:

function myfunction

n = n/nil

end

if pcall(myfunction) then

print(“Success”)

else

print(“Failure”)

end

当我们运行上面的程序,会得到下面的输出。

代码如下:

Failure

xpcall (f, err) 函数调用所要求的功能,还设置了错误处理程序。f 任何错误不传播; 相反,xpcall 捕获错误,要求与原来的错误对象Err函数,并返回一个状态代码。

一个简单的例子为 xpcall 如下所示。

代码如下:

function myfunction ()

n = n/nil

end

function myerrorhandler( err )

print( “ERROR:”, err )

end

status = xpcall( myfunction, myerrorhandler )

print( status)

当我们运行上面的程序,会得到下面的输出。

代码如下:

ERROR: test2.lua:2: attempt to perform. arithmetic on global ‘n‘ (a nil value)

false

作为一个程序员最重要的是要确保正确的错误处理。使用错误处理可以确保超出边界条件意想不到的条件,而不会干扰该程序的用户进行处理。

篇3:Linux 下 C++程序的异常处理技巧Linux

处理 C++ 中的异常会在语言级别上遇到少许隐含限制,但在某些情况下,您可以绕过它们,学习各种利用异常的方法,您就可以生产更可靠的应用程序。 保留异常来源信息 在 C++中,无论何时在处理程序内捕获一个异常,关于该异常来源的信息都是不为人知的。异常的

处理 C++ 中的异常会在语言级别上遇到少许隐含限制,但在某些情况下,您可以绕过它们。学习各种利用异常的方法,您就可以生产更可靠的应用程序。

保留异常来源信息

在 C++中,无论何时在处理程序内捕获一个异常,关于该异常来源的信息都是不为人知的。异常的具体来源可以提供许多更好地处理该异常的重要信息,或者提供一些可以附加到错误日志的信息,以便以后进行分析。

为了解决这一问题,可以在抛出异常语句期间,在异常对象的构造函数中生成一个堆栈跟踪。ExceptionTracer 是示范这种行为的一个类。

清单 1. 在异常对象构造函数中生成一个堆栈跟踪

// Sample Program:

// Compiler: gcc 3.2.3 0502

// Linux: Red Hat

#include

#include

#include

#include

using namespace std;

/////////////////////////////////////////////

class ExceptionTracer

{

public:

ExceptionTracer()

{

void * array[25];

int nSize = backtrace(array, 25);

char ** symbols = backtrace_symbols(array, nSize);

for (int i = 0; i < nSize; i++)

{

cout << symbols[i] << endl;

}

free(symbols);

}

};

管理信号

每当进程执行一个令人讨厌的动作,以致于 Linux? 内核发出一个信号时,该信号都必须被处理。信号处理程序通常会释放一些重要资源并终止应用程序。在这种情况下,堆栈上的所有对象实例都处于未破坏状态。另一方面,如果这些信号被转换成 C++ 异常,那么您可以优雅地调用其构造函数,并安排多层 catch 块,以便更好地处理这些信号。

清单 2 中定义的 SignalExceptionClass,提供了表示内核可能发出信号的 C++ 异常的抽象。SignalTranslator 是一个基于 SignalExceptionClass 的模板类,它通常用来实现到 C++ 异常的转换。在任何瞬间,只能有一个信号处理程序处理一个活动进程的一个信号。因此,SignalTranslator 采用了 singleton 设计模式。整体概念通过用于 SIGSEGV 的 SegmentationFault 类和用于 SIGFPE 的 FloatingPointException 类得到了展示。

清单 2. 将信号转换成异常

template class SignalTranslator

{

private:

class SingleTonTranslator

{

public:

SingleTonTranslator()

{

signal(SignalExceptionClass::GetSignalNumber(), SignalHandler);

}

static void SignalHandler(int)

{

throw SignalExceptionClass();

}

};

public:

SignalTranslator()

{

static SingleTonTranslator s_objTranslator;

}

};

// An example for SIGSEGV

class SegmentationFault : public ExceptionTracer, public exception

{

public:

static int GetSignalNumber() {return SIGSEGV;}

};

SignalTranslator g_objSegmentationFaultTranslator;

// An example for SIGFPE

class FloatingPointException : public ExceptionTracer, public exception

{

public:

static int GetSignalNumber() {return SIGFPE;}

};

SignalTranslator g_objFloatingPointExceptionTranslator;

管理构造函数和析构函数中的异常

在全局(静态全局)变量的构造和析构期间,每个 ANSI C++ 都捕获到异常是不可能的,

因此,ANSI C++ 不建议在那些其实例可能被定义为全局实例(静态全局实例)的类的构造函数和析构函数中抛出异常。换一种说法就是永远都不要为那些其构造函数和析构函数可能抛出异常的类定义全局(静态全局)实例。不过,如果假定有一个特定编译器和一个特定系统,那么可能可以这样做,幸运的是,对于 Linux 上的 GCC,恰好是这种情况。

使用 ExceptionHandler 类可以展示这一点,该类也采用了 singleton 设计模式。其构造函数注册了一个未捕获的处理程序。因为每次只能有一个未捕获的处理程序处理一个活动进程,构造函数应该只被调用一次,因此要采用 singleton 模式。应该在定义有问题的实际全局(静态全局)变量之前定义 ExceptionHandler 的全局(静态全局)实例。

清单 3. 处理构造函数中的异常

class ExceptionHandler

{

private:

class SingleTonHandler

{

public:

SingleTonHandler()

{

set_terminate(Handler);

}

static void Handler()

{

// Exception from construction/destruction of global variables

try

{

// re-throw

throw;

}

catch (SegmentationFault &)

{

cout << “SegmentationFault” << endl;

}

catch (FloatingPointException &)

{

cout << “FloatingPointException” << endl;

}

catch (...)

{

cout << “Unknown Exception” << endl;

}

//if this is a thread performing some core activity

abort();

// else if this is a thread used to service requests

// pthread_exit();

}

};

public:

ExceptionHandler()

{

static SingleTonHandler s_objHandler;

}

};

//////////////////////////////////////////////////////////////////////////

class A

{

public:

A()

{

//int i = 0, j = 1/i;

*(int *)0 = 0;

}

};

// Before defining any global variable, we define a dummy instance

// of ExceptionHandler object to make sure that

// ExceptionHandler::SingleTonHandler::SingleTonHandler() is invoked

ExceptionHandler g_objExceptionHandler;

A g_a;

//////////////////////////////////////////////////////////////////////////

int main(int argc, char* argv[])

{

return 0;

}

处理多线程程序中的异常

有时一些异常没有被捕获,这将造成进程异常中止。不过很多时候,进程包含多个线程,其中少数线程执行核心应用程序逻辑,同时,其余线程为外部请求提供服务。如果服务线程因编程错误而没有处理某个异常,则会造成整个应用程序崩溃。这一点可能是不受人们欢迎的,因为它会通过向应用程序传送不合法的请求而助长拒绝服务攻击。为了避免这一点,未捕获处理程序可以决定是请求异常中止调用,还是请求线程退出调用。清单 3 中 ExceptionHandler::SingleTonHandler::Handler() 函数的末尾处展示了该处理程序。

结束语

本文简单地讨论了少许 C++ 编程设计模式,以便更好地执行以下任务:

・在抛出异常的时候追踪异常的来源。

・将信号从内核程序转换成 C++ 异常。

・捕获构造和/或析构全局变量期间抛出的异常。

・多线程进程中的异常处理。

原文转自:www.ltesting.net

篇4:浅谈活性污泥法运行中的异常及处理

浅谈活性污泥法运行中的异常及处理

摘要:活性污泥法是常用的'污水处理工艺,但由于原料和工艺控制等多种原因,使活性污泥在运行中经常会发生一些异常现象,本文探讨了活性污泥法运行中较常见的异常现象及其防治措施.作 者:张影华  作者单位:黑龙江农垦林业职业技术学院,黑龙江,宾西,150431 期 刊:中国科技纵横   Journal:CHINA SCIENCE & TECHNOLOGY PANORAMA MAGAZINE 年,卷(期):, “”(14) 分类号:X7 关键词:活性污泥法    运行    异常现象    措施   

篇5:Python编程中的异常处理教程

作者:selFire 字体:[增加 减小] 类型: 时间:-08-21

这篇文章主要介绍了Python编程中的异常处理教程,是Python入门学习中的基础知识,需要的朋友可以参考下

1、异常简介

从软件方面来说,错误是语法或是逻辑上的,当python检测到一个错误时,解释器就会指出当前流已经无法继续执行下去,这时候就出现了异常,异常分为两个阶段:首先是引起异常发生的错误,然后是检测和采取可能的措施。常见异常有

NameError、ZeroDivisionError、SyntaxError、IndexError、KeyError、IOError、AttributeError、ValueError、

TypeError等。所有的标准/内建异常都是从根异常派生的,目前,有3个直接从BaseException派生的异常子类:SystemExit,KeyboardInterrupt和Exception。其它的所有的内建异常都是Exception的子类。

2、异常检测及处理

异常可以通过try语句来检测,有两种主要形式:try-except和try-finally。前者可以添加一个可选的else子句来处理没有检测到异常的情况。一个try语句可以对应一个或多个except语句,但只能对应一个finally子句,except用来捕获并处理异常,可以处理多个异常,也可以指定可选的异常参数(将会是一个包含来自异常的代码的诊断信息的类实例,异常参数自身会组成一个元组,并存储为类实例的属性),要避免裸except(会捕获所有异常,没有机会保存异常发生的原因,虽然可以通过sys.exc_info获得,但不推荐,如果想捕获所有异常,可以在except中使用BaseException类,而Exception类不包括KeyboardInterrupt和SystemExit),finally无论发生错误与否都会执行。try-except-finally是个复合语句。try检测到异常时,try语句块中的剩余代码是不会执行的,异常会延着堆栈向上提交,直到找到合适的异常处理器,如果到达最顶层仍然没有找到对应的处理器,python解释器会显示出跟踪返回消息,然后退出。

try-except语法如下:

try: try_suite except Exception1[, reason1]: suite_for_exception_ Exception1 except Exception2[, reason2]: suite_for_exception_ Exception2 except (Exception3, Exception4)[, reason3_4]: suite_for_exceptions_ Exception3_and_Exception4 except (Exc5[, Exc6[, ... ExcN]])[, reason]: suite_for_exceptions_ Exc5_to_ExcN else: suite_for_no_exception finally: suite_always_run

可同时捕捉多个异常,可捕捉异常对象,可忽略异常类型以捕捉所有异常

>>> try: x = int(input(‘input x:‘)) y = int(input(‘input y:‘)) print(‘x/y = ‘,x/y) except ZeroDivisionError: #捕捉除0异常 print(“ZeroDivision”) except (TypeError,ValueError) as e: #捕捉多个异常,并将异常对象输出 print(e) except: #捕捉其余类型异常 print(“it‘s still wrong”) input x:12 input y:0 ZeroDivision >>> try: x = int(input(‘input x:‘)) y = int(input(‘input y:‘)) print(‘x/y = ‘,x/y) except ZeroDivisionError: #捕捉除0异常 print(“ZeroDivision”) except (TypeError,ValueError) as e: #捕捉多个异常,并将异常对象输出 print(e) except: #捕捉其余类型异常 print(“it‘s still wrong”) input x:12 input y:y invalid literal for int() with base 10: ‘y‘

try/except 可以加上 else 语句,实现在没有异常时执行什么

>>> try: x = int(input(‘input x:‘)) y = int(input(‘input y:‘)) print(‘x/y = ‘,x/y) except ZeroDivisionError: #捕捉除0异常 print(“ZeroDivision”) except (TypeError,ValueError) as e: #捕捉多个异常 print(e) except: #捕捉其余类型异常 print(“it‘s still wrong”) else: #没有异常时执行 print(‘it work well‘) input x:12 input y:3 x/y = 4.0 it work well

3、上下文管理中的with语句

如上提到的try-except和try-finally,python对隐藏细节做了大量的工作,因此需要你操心的仅是如何解决你所遇到的问题。另一个隐藏低层次的抽象的例子是with语句,它在python2.6中正式启用。python2.5尝试性的引入了with,并对使用with作为标识符的应用程序发出这样的警告――在python2.6中,with将会成为关键字。如果你想在python2.5使用wiht语句,你必须用from __fututure__ import with_statement来导入它。

类似try-except-finally,with语句也是用来简化代码的,这与用try-except和try-finally所想达到的目的千呼后应。try-except和try-finally的一种特定的配合用法是保证共享的资源的唯一分配,并在任务结束的时候释放它。比如文件(数据、日志、数据库等等),线程资源,简单同步,数据库连接等等,with语句的目的就是应用在这种场景,

然而,with语句的目的在于从流程图中把try,except和finally关键字和资源分配释放相关代码统统去掉,而不是像try-except-finally那样仅仅简化代码使之易用。with语法的基本用法如下:

with context_expr [as var]: with_suite

看起来如此简单,但with仅能工作于支持上下文管理协议的对象。当with语句执行时,便执行context_expr来获得一个上下文管理器,其职责是提供一个上下文对象,这是通过调用__context__()方法来实现的。一旦我们获得了上下文对象,就会调用它的__enter__()方法。当with语句块执行结束,会调用上下文对象的__exit__()方法,有三个参数,如果with语句块正常结束,三个参数都是None,如果发生异常,三个参数的值分别等于调用sys.exc_info()函数返回的三个值:类型(异常类),值(异常实例)和回溯(traceback)相应的回溯对象。contextlib模块可以帮助编写对象的上下文管理器。

常见异常:

Exception                       所有异常的基类

AttributeError                特性应用或赋值失败时引发

IOError                            试图打开不存在的文件时引发

IndexError                      在使用序列中不存在的索引时引发

KeyError                         在使用映射不存在的键时引发

NameError                      在找不到名字(变量)时引发

SyntaxError                    在代码为错误形式时引发

TypeError                        在内建操作或者函数应用于错误类型的对象是引发

ValueError                      在内建操作或者函数应用于正确类型的对象,但是该对象使用不合适的值时引发

ZeroDivisionError         在除法或者摸除操作的第二个参数为0时引发

4.自定义异常:

继承于 Exception 的类

class myException(Exception):pass

5.抛出异常:

raise 语句

>>> def division(x,y): if y == 0 : raise ZeroDivisionError(‘The zero is not allow‘) return x/y >>> try: division(1,0) except ZeroDivisionError as e: print(e) The zero is not allow

6.finally 语句

不管是否出现异常,最后都会执行finally的语句块内容,用于清理工作

所以,你可以在 finally 语句中关闭文件,这样就确保了文件能正常关闭

>>> try: x = int(input(‘input x:‘)) y = int(input(‘input y:‘)) print(‘x/y = ‘,x/y) except ZeroDivisionError: #捕捉除0异常 print(“ZeroDivision”) except (TypeError,ValueError) as e: #捕捉多个异常 print(e) except: #捕捉其余类型异常 print(“it‘s still wrong”) else: #没有异常时执行 print(‘it work well‘) finally: #不管是否有异常都会执行 print(“Cleaning up”) input x:12 input y:3 x/y = 4.0 it work well Cleaning up

异常抛出之后,如果没有被接收,那么程序会抛给它的上一层,比如函数调用的地方,要是还是没有接收,那继续抛出,如果程序最后都没有处理这个异常,那它就丢给操作系统了 -- 你的程序崩溃了,这点和C++一样的。

篇6:PL/SQL中的几种异常处理方法数据库教程

异常处理

这是Pona的文章,我斗胆将其贴上来,Pona不要介意哦!^_^

PL/SQL里,有三种方法可以在处理大批量数据时不会因为一条或几条数据错误而导致异常中止程序,

1、用Fetch into a cursor%TYPE把要处理的数据放到记录集里。当一条数据不符条件时,用标签<>和GOTO NEXT_RECORD跳转语句使程序忽略这一条,转到下一条继续处理。

-------------------------------------------------------------------------------

-- Function Name    : CalculateImportCharge

-- Function Desc    : Calculate Import Charge

-- Created by       : Author

-- Created Date     : -05-16

-------------------------------------------------------------------------------

FUNCTION CalculateImportCharge (

p_i_job_id       IN VARCHAR2,

p_i_as_of_date_id IN VARCHAR2) RETURN NUMBER

AS

CURSOR cur_ShipBlHeader IS

SELECT import_folder_no

FROM GMY_SHIP_BL_HEADER

WHERE CANCEL_FLG = GMY_GA000_PKG.BL_CANCEL_FLG_OFF;

rec_ShipBlHeader       cur_ShipBlHeader%ROWTYPE;

BEGIN

OPEN cur_ShipBlHeader;

FETCH cur_ShipBlHeader INTO rec_ShipBlHeader;

WHILE cur_ShipBlHeader%FOUND LOOP

x_num_error_code := GMY_GA000_PKG.CheckValidMasterBlNo (

p_i_job_id,

p_i_as_of_date_id,

rec_ShipBlHeader.import_folder_no,

x_vch_message);

IF x_num_error_code

IN (GMY_GA000_PKG.gn#NG, GMY_GA000_PKG.INVALID_BL_NO) THEN

x_vch_message :=

p_i_job_id

|| ' WARNING: Function CheckValidMasterBlNo @'

|| ' Import folder '

|| rec_ShipBlHeader.import_folder_no

|| ' - Invalid BL No.';

COM_LOG.PUTLINE (p_i_job_id, x_vch_message);

GOTO NEXT_RECORD;

END IF;

x_num_error_code := CheckExistsOfAccDate (

p_i_job_id,

p_i_as_of_date_id,

rec_ShipBlHeader.import_folder_no);

IF x_num_error_code = GMY_GA000_PKG.gn#NG THEN

GOTO NEXT_RECORD;

END IF;

COMMIT;

<>

FETCH cur_ShipBlHeader INTO rec_ShipBlHeader;

END LOOP;

CLOSE cur_ShipBlHeader;

RETURN GMY_GA000_PKG.gn#OK;

EXCEPTION

WHEN OTHERS THEN

x_vch_message :=

p_i_job_id

|| ' ERROR:  Function CalculateImportCharge @ '

|| SUBSTR (SQLERRM (SQLCODE), 1, 100);

COM_LOG.PUTLINE (p_i_job_id, x_vch_message);

RETURN GMY_GA000_PKG.gn#NG;

END CalculateImportCharge;

2、当使用the Cursor FOR Loop循环时,在Loop循环里,把会出问题的情况写进一个独立的block块中,这个块包括完整的begin、end部分及exception异常处理部分。这样即使一条数据出现异常,也会继续执行下一条。

-------------------------------------------------------------------------------

-- Function Name    : GenerateInsCostInfRec

-- Function Desc    : Generate records to transmit in INF table

-- Created by       : SISS(AP)

-- Created Date     : 2003-03-26

-- ----------------------------------------------------------------------------

FUNCTION GenerateInsCostInfRec (

p_i_job_id            IN      VARCHAR2,

p_i_as_of_date_id     IN      VARCHAR2) RETURN NUMBER

AS

CURSOR cur_cost IS

SELECT cost.ROWID costRowId,

cost.import_folder_no,,

cost.insur_trans_id

FROM GMY_COST_BL cost,

GMY_COMMON_MST mst

WHERE cost.import_folder_no=invheader.import_folder_no

AND cost.billing_amt_num IS NOT NULL

AND cost.billing_amt_num!=0

AND cost.insur_db_cr!=0;

BEGIN

FOR rec_cost IN cur_cost LOOP

BEGIN

x_num_ret_value := GMY_GA000_PKG.CheckValidMasterBlNo(

p_i_job_id,

p_i_as_of_date_id,

rec_cost.import_folder_no,

x_vch_error_msg);

IF x_num_ret_value = GMY_GA000_PKG.VALID_BL_NO THEN

INSERT INTO GMY_COST_INS_INF(

cost_trx_id,,

created_by,

program_name)

VALUES(

GMY_COST_INS_INF_S.NEXTVAL,

PRG_NAME,

PRG_NAME);

ELSIF x_num_ret_value = GMY_GA000_PKG.INVALID_BL_NO THEN

x_vch_error_msg := p_i_job_id

|| ' Import folder '

|| rec_cost.import_folder_no

|| ' has repeated BL No. with other import folder.'

|| ' Failed in insurance cost transmission.';

COM_LOG.PUTLINE(p_i_job_id, x_vch_error_msg);

END IF;

EXCEPTION

WHEN OTHERS THEN

IF SQL%ROWCOUNT > 0 THEN -- check for 'too many rows'

x_vch_error_msg := p_i_job_id||' '||

SUBSTR(SQLERRM(SQLCODE),1,100);

COM_LOG.PUTLINE(p_i_job_id, x_vch_error_msg);

ELSE

x_vch_error_msg := p_i_job_id||' '||

SUBSTR(SQLERRM(SQLCODE),1,100);

COM_LOG.PUTLINE(p_i_job_id, x_vch_error_msg);

END IF;

END;

END LOOP;

COMMIT;

RETURN GMY_GA000_PKG.gn#OK;

EXCEPTION

WHEN OTHERS THEN

x_vch_error_msg := p_i_job_id||' '||SUBSTR(SQLERRM(SQLCODE),1,100);

COM_LOG.PUTLINE(p_i_job_id, x_vch_error_msg);

ROLLBACK;

RETURN GMY_GA000_PKG.gn#NG;

END GenerateInsCostInfRec;

3、当使用the Cursor FOR Loop循环时,在Loop循环里,把会出问题的情况拆分成子函数,分别处理,

----------------------------------------------------------------------------

-- Function Name     : CopyDsToActualDs

-- Function Desc     : Copy the records from DS DB to Actual DS DB.

-- Created by        : Author

-- Created Date      : 2003-02-20

----------------------------------------------------------------------------

FUNCTION CopyDsToActualDs (

p_i_job_id        IN  VARCHAR2,

p_i_as_of_date_id IN  VARCHAR2) RETURN NUMBER

IS

CURSOR cur_DsScc IS

SELECT *

FROM  GMY_DS_SCC;

BEGIN

FOR rec_DsHead IN cur_DsScc LOOP

x_num_error_code := InsToActualScc(

p_i_job_id,

p_i_as_of_date_id,

rec_DsHead.order_by_code,

rec_DsHead.po_code,

rec_DsHead.wh);

END LOOP;

EXCEPTION

WHEN OTHERS THEN

x_vch_error_msg := p_i_job_id

||' Function Name: CopyDsToActualDs';

COM_LOG.PUTLINE(p_i_job_id,x_vch_error_msg);

x_vch_error_msg:=p_i_job_id||' '||SUBSTR(SQLERRM(SQLCODE),1,100);

COM_LOG.PUTLINE(p_i_job_id, x_vch_error_msg);

ROLLBACK;

RETURN GMY_GA000_PKG.gn#NG;

END CopyDsToActualDs;

----------------------------------------------------------------------------

-- Function Name     : InsToActualScc

-- Function Desc     : Deal with insert section.

-- Created by        : Author

-- Created Date      : 2003-03-13

----------------------------------------------------------------------------

FUNCTION InsToActualScc(

p_i_job_id                     IN      VARCHAR2,

p_i_as_of_date_id              IN      VARCHAR2,

p_i_order_by_code              IN      VARCHAR2,

p_i_po_code                    IN      VARCHAR2,

p_i_wh                         IN      VARCHAR2

) RETURN NUMBER

IS

x_vch_error_msg VARCHAR2(255);

BEGIN

INSERT INTO GMY_ACTUAL_DS_SCC(

order_by_code,

po_code,

wh )

VALUES( p_i_order_by_code,

p_i_po_code,

p_i_wh);

COMMIT;

RETURN GMY_GA000_PKG.gn#OK;

EXCEPTION

WHEN OTHERS THEN

x_vch_error_msg := p_i_job_id||' Function Name: InsToActualScc';

COM_LOG.PUTLINE(p_i_job_id,x_vch_error_msg);

x_vch_error_msg := p_i_job_id

||' The key of the record that failed to insert is: ';

COM_LOG.PUTLINE(p_i_job_id,x_vch_error_msg);

ROLLBACK;

RETURN GMY_GA000_PKG.gn#NG;

END InsToActualScc;

篇7:Python中使用异常处理来判断运行的操作系统平台方法

这篇文章主要介绍了Python中使用异常处理来判断运行的操作系统平台方法,这个方法比较新颖,,需要的朋友可以参考下

代码实例:

代码如下:

try:

import termios, TERMIOS 1

except ImportError:

try:

import msvcrt2

except ImportError:

try:

from EasyDialogs import AskPassword 3

except ImportError:

getpass = “default_getpass” 4

else:

getpass = “AskPassword” 5

else:

getpass = “win_getpass”

else:

getpass = “unix_getpass”

1:termios 是 UNIX 独有的一个模块,它提供了对于输入终端的底层控制,

Python中使用异常处理来判断运行的操作系统平台方法

如果这个模块无效 (因为它不在你的系统上,或你的系统不支持它),则导入失败,Python 引发我们捕捉的 ImportError 异常。

2:OK,我们没有 termios,所以让我们试试 msvcrt,它是 Windows 独有的一个模块,可以提供在 Microsoft Visual C++ 运行服务中的许多有用的函数的一个API。如果导入失败,Python 会引发我们捕捉的 ImportError 异常。

3:如果前两个不能工作,我们试着从 EasyDialogs 导入一个函数,它是 Mac OS 独有的一个模块,提供了各种各样类型的弹出对话框。再一次,如果导入失败,Python 会引发一个我们捕捉的 ImportError 异常。

4:这些平台特定的模块没有一个有效 (有可能,因为 Python 已经移植到了许多不同的平台上了),所以我们需要回头使用一个缺省口令输入函数 (这个函数定义在 getpass 模块中的别的地方)。注意我们在这里所做的:我们将函数 default_getpass 赋给变量 getpass。如果你读了官方 getpass 文档,它会告诉你 getpass 模块定义了一个 getpass 函数。它是这样做的:通过绑定 getpass 到正确的函数来适应你的平台。然后当你调用 getpass 函数时,你实际上调用了平台特定的函数,是这段代码已经为你设置好的。你不需要知道或关心你的代码正运行在何种平台上;只要调用 getpass,则它总能正确处理。

5:一个 try...except 块可以有一条 else 子句,就像 if 语句。如果在 try 块中没有异常引发,然后 else 子句被执行。在本例中,那就意味着如果 from EasyDialogs import AskPassword 导入可工作,所以我们应该绑定 getpass 到 AskPassword 函数。其它每个 try...except 块有着相似的 else 子句,当我们发现一个 import 可用时,就绑定 getpass 到适合的函数。

篇8:马氏距离与欧氏距离方法在地球化学异常处理中的对比

宋运红,李振祥,孙连辉,贾大成,部雪娇

1.吉林大学地球探测科学与技术学院,吉林长春 130061;2.,1

2

2

1

1

摘要:,马氏距离就是一个在地球以往比较普遍使用的是以欧氏距离为基础的计算方法,1∶5万地球化学数据处理为例,,马氏距离方法考虑到了不同元素之间的相互关系,利用马氏距离方法求得的综合地球化学异常范围集中、界线清楚、强度突出、与已知矿体的吻合程度高,较欧氏距离方法具有明显优势,并在实际中可行。

关键词:地球化学数据处理;综合地球化学异常;欧氏距离;马氏距离;对比中图分类号:P618,P632 文献标识码:A

ContrastbetweenMahalanobisdistanceandEuclideandistance

ingeochemicalexplorationprocessing

SONGYun2hong,LIZhen2xiang,SUNLian2hui,JIADa2cheng,BUXue2jiao

1.CollegeofGeoexplorationScienceandTechnology,JilinUniversity,Changchun130026,Jilin,China;2.InnerMongoliaNo.

10InstituteofGeologyandMineralExplorationandDevelopment,Chifeng,024005,InnerMongolia,China

1

2

2

1

1

Abstract:Theaccuracyandvalidityofthedeterminationofsyntheticgeochemicalanomalyaretheimportantcontentsintheprocessingofgeochemicalanomaly.Thedeterminationofsyntheticgeochemicalanomalyisbasedonmulti2variatenormaldistributiontheory,whichisthedirectlypromotionandapplicationofmultivariablestatisticalmethod,Mahalanobisdistanceisacompositeindicatorthatwidelyappliedinidentifyingoutlier,discriminantanaly2sisandotherrelatedareaofgeochemistry.Euclideandistancewasuniversallyusedintraditionalmethed,however,inrecenttwentyyears,Euclideandistancehasbeenappliedincreasedly.Takingtheprocessingof1∶50000geo2chemistrydataforexampleinthispaper,twomethodswerecontrastedfromtheoryandappliedeffects.

Interrela2

tionshipoftheelementshadbeenconsideredinMahalanobisdistance.SyntheticgeochemicalanomalycomputedbyMahalanobisdistancehassuchcharactersascentralizedscope,cleardemarcationline,prominentintensity,highanastomosiswithknownorebody.MahalanobisdistancehasobviousadvantageoverEuclideandistanceandisfeasi2bletobeappliedinreality.

Keywords:geochemicaldataprocessing;syntheticgeochemicalanomaly;Mahalanobisdistance;Euclideandistance;contrast

收稿日期:204225;改回日期:2008211210

作者简介:宋运红(19832),女,山东泰安人,吉林大学地球探测科学与技术学院硕士研究生。

118

吉 林 地 质 第27卷

地球化学背景和异常划分是地球化学处理方法

中的重要内容,直接影响地球化学找矿的效果。基于一元正态分布理论,通过计算样品数据的统计学参数(均值、标准离差等)得出背景值和异常下

[1]

限,获得单指标异常,随着多元正态分布理论在地球化学数据处理中的应用,综合地球化学异常在地化找矿和成矿预测中的优势得到充分的发挥,已逐渐成为一种常规的地球化学异常处理方法。基于多元正态分布理论的多指标综合地球化学异常处理方法,实际上是多变量统计方法的直接推广与应用,算方法,,20[2]

别。由于,常上也有所差别,然而,对于这两种方法在地球化学异常处理效果上的差异如何却鲜有讨论。本文以河北某地1∶5万地球化学数据处理为例,试图从理论上和应用效果上对两种方法进行比较,查找各自的优缺点,以便在进行地球化学综合异常评价时为选择合理处理方法提供依据。

并作为区分背景与异常的有效方法112 马氏距离的基本原理

[3]

由于欧氏距离只是各变量至变量平均值的几何距离,而没有考虑到变量之间的相关关系,为解决这个问题,印度著名统计学家马哈拉诺比斯提出了“基于多元统计的马氏距离方法”,它是一种有效X-X)=D

2

-1

-1

[6]

(3)

2

;X为元素平均值;S为原始;S为原始数据协方差矩阵逆矩阵。

在原始变量空间中,马氏距离是考虑样本中变量间相关性的各样本到样本平均值的距离,对于每

-1

(X-X)一个给定的正值D,(X-X)′S

=D就

2

确定了一个m维超椭球。通过不断改变D值,就

可以得到具有相同中心的超椭球束,它们的形状和方向由S确定,它们的大小由D确定。在椭球面

2

上,马氏距离的概率密度不变,D越小,概率密度越大,D越大,概率密度越小,当D大到一定程度时,其分布的概率密度就会小到一定的程度,以至于在此范围外的所有点不再属于正态分布总体,即它们在一定程度上属于异常点,因此,只要找到这个临界距离Dα,则大于它的均为异常样

2

[4]

2

2

1 马氏距离和欧氏距离的基本原理

111 欧氏距离的基本原理

欧氏距离是使用最为广泛的一种方法。其计算公式为:

m

从总体中剔除异常样品,剩下的就是正态分布总体,从而可求得正态分布总体的平均值,这就是所求得的综合背景值,剔除的异常样就是我们所需要的综合异常样。

2

在实际应用中,临界距离Dα可用F分布(可由F分布表查出)确定:

d=

=1

(X

ik

-Xjk),i、j=1,2,…,n

2

(1)

其中一种特殊情况,点i到分布中心的欧氏距

离,公式如下:

m

d=

=1

(X

ik

-Xj),i=1,2,…,n

2

(2)

2

=Fα(m,n-m)(n-m)n

2

(4)

式中:Xij为样品点;Xj为变量的平均值。

欧氏距离是一种点与点间的距离,在多元统计中,我们所要解决的不再是具体的点到点的距离,而是样品点到相应总体的距离,因此,需要在总体中找一个最具代表性的点,用样品点到代表点的距离定义样品点到相应总体的距离,总体的均值向量Xj就是这样的代表点,因为它是总体的取值以概率加权后的“中心”点,从而可以很容易的推广到3个变量乃至更多变量的场合。欧氏距离的突出特点是考虑到各变量至各变量平均值的几何距离,

马氏距离是建立在多元正态分布理论之上的方法,由于其所考虑的是多种相互作用的因素,因而更适合多元或多因素的求异。

2 马氏距离与欧氏距离基本原理比较

虽然综合地球化学异常的确定是以多元正态分布理论为基础,但基于上述不同的计算方法,对于多元数据统计过程存在不同条件和含义。对于确定综合地球化学异常,欧氏距离体现出3个主要的'不足:(1)欧氏距离的值与总体各分量的量纲有关,

第4期 宋运红李振祥等:马氏距离与欧氏距离方法在地球化学异常处理中的对比

119

而各种元素在地壳中的含量有着明显的差距,需要统一量纲,在统一量纲过程中有一定的人为性和随意性,而且任何一个变量计量单位的改变都会使此距离的数值改变;(2)欧氏距离的定义没有考虑各个变量之间的相关性。实际上,欧氏距离是把各个变量都同等看待,将两个样本在各个变量上的离差简单地进行了综合;(3)欧氏距离必须满足正态分布条件,对地球化学数据首先要进行正态分布检验。

同样建立在多元正态分布理论基础上的马氏距离方法,考虑了均值、方差和协方差3,。

马氏距离是考虑样本中变量间相关性的各变量至变量平均值的距离;而欧氏

[5]

距离只是各变量至变量平均值的几何距离。马氏距离相对于欧氏距离而言具有以下优点:(1)马氏距离是欧几里德空间中非均匀分布的归一化距离,不用考虑各特征参数的量纲,且与各分量单位的选取无关;(2)马氏距离是根据整个空间上的特征分布情况作为判别依据的,考虑了变量之间的相关性影响。因此,它能更好地描述元素之间的相似性,为更高一级的数据分析提供有效的数据;(3)可以不严格地满足正态分布条件。

在实际应用中,地球化学样品往往要受到多种互相关联的因素控制。如该地区的地层、岩石、构造以及化学物质的污染情况等等多种地质条件、地球化学因素,这些因素彼此影响,在很大程度上影响样品中各元素的分布状态和结构。在同一地质环境中,有显著异常的区域往往与成矿作用或其它特有地质作用有关,此外,我们实地遇到的某地区也并不是只有一次成矿作用和只产一种矿床,即使是一种矿床也往往会有多种伴生元素,所以得到这个地区综合异常是非常必要的,然而只有在查明数据总体与各变量及各变量之间的联系,刻画出总体多元结构的基础上,才有可能正确区分背景与异常。马氏距离D是广义平方距离的一种,以多元正态分布理论为基础,有效地考虑了均值、方差、协方差3个参数,由于其所考虑的是多种相互作用的因素,是一个能够较全面描述总体多元结构的综合指标,在矿产资源预测、异常圈定、生态环境研究、

2

气象等方面得到了广泛的应用。

篇9:马氏距离与欧氏距离方法在地球化学异常处理中的对比

两种方法确定的综合异常分布总体上具有类似性,综合异常个数相同,多数异常基本可以对应,如图1中Z1、Z2、Z7、Z3、Z4、Z5、Z6、Z8号异常分别对应图2中的M1、M2、M4、M5、M6、M8、M10、M7号异常。但是在异常空间位置、异常范围和异常强度等方面仍然存在一定差异。

从两异常图对比可以看出,马氏距离综合异常具有如下优势:异常范围面积比较小,界线清楚,异常浓集中心明显,且异常含量等级清晰,异常强度突出,与已知矿体的吻合程度高,异常空间分布与区域线性构造的关系更密切,异常的带状能够体现出区域成矿带的特征,有利于在找矿中的实际应用。由此可见,利用马氏距离方法确定的综合异常具有比较好的应用效果。

图2 马氏距离综合异常等值线图

Fig12 SystheticanomalycontourmapwithMahalano2

bisdistance

4 结论

(1)马氏距离和欧氏距离都是建立在多元正

(下转129页)

在马氏距离综合异常图中,有10个主要异常

第4期 丁志江王 猛:基于GoogleEarth影像图遥感解译在我国西北矿产地质调查中的应用

129

变化、植被覆盖等等容易时过境迁的图象信息反映差异较大。显然GE影像更加接近于目前工作区内的实际情况。能更加准确有效地指导野外调查工作。GE还能够动态显示光标位置的经纬度及高程,虽然其数据误差较大,但我们可以利用它能大体测算区内各地点间的相对高差,及时发现野外调查工作当中的安全隐患,减少安全事故的发生。让我们在任何一个陌生环境中仍能做到心中有数。不至于无的放失。

另外GE还可以与GPS进行连接,对野外调查工作进行实时控制。也可以通过GE采集种类界线的坐标点,编辑航线,导入GPS后进行导航地质观测。

其实GE的应用远远不限于此。我们可以在实地的工作当中充分利用GE带给我们的丰富的免费信息,,让GE在 (上接120页)

态分布理论之上的方法,在处理地球化学测量数据中都有应用,但基于欧氏距离的计算方法应用得较为普遍。从两种计算方法的原理分析,欧氏距离只是各变量与变量平均值的几何距离,而马氏距离是考虑样本中变量间相关性的各变量至变量平均值的距离,因而考虑到多种相互作用的因素,由于地球化学异常的形成是各种地质和成矿因素的综合,因而应用马氏距离方法求多元综合地球化学异常较欧氏距离方法更为客观。

(2)从实际应用效果上看,马氏距离法所确定的综合异常与欧氏距离法所确定的综合异常总体上在异常个数和分布特征方面基本可以对比,具有相似性。然而,马氏距离法所确定的综合异常范围集中、浓集中心明显、界线清楚、强度突出、与已知矿体和线性构造的吻合程度高,既减轻了多元组合异常重叠而造成的图面负荷太重,又便于对多元组合异常的验证和评价,其应用效果明显优于欧氏

距离方法。参考文献:

[1]吴锡生.化探数据处理方法[M].北京:地质出版

社,1992,38245.

[2]朴寿成,陶文宏,连长云.利用X分布确定多元地

2

球化学异常的方法[J].吉林地质,,16(3):

71274.

[3]时艳香,纪宏金,郝立波等.利用水系沉积物地球化

学数据判别浅覆盖区岩性与构造-欧氏距离法[J].物探化探计算技术,,26(3):2432246.

[4]纪宏金,林瑞庆,周永昶.关于若干化探数据处理方

法的讨论[J].地质与勘探,,37(4):56259.

[5]时艳香,纪宏金,陆继龙等.水系沉积物地球化学分

区的因子分析方法与应用[J].地质与勘探,2004,

40(5):73276.

[6]李玉榕,项国波.一种基于马氏距离的线性判别分析

分类算法[J].计算机仿真,,32(8):86289.

篇10:马氏距离与欧氏距离方法在地球化学异常处理中的对比

效果对比

以河北某地区正规1∶5万水系沉积物地球化学测量数据为例,比较应用马氏距离和欧氏距离确定多元综合异常的方法1476个样品,,根据综合异常直观地比较两。

31 R型因子分析地球化学组合异常

对该图幅数据处理得到R型因子分析结果(表1),其中:F1因子主要是Au、Ag、Pb、Sb组合;F2因子主要是Mn、As、Sb组合;F3因子主要是Cu、Pb组合;F4因子主要是Mo、Mn组合;F5因子主要是Co、Mn组合;F6因子主要是Zn(Mn、Pb)组合;F7因子主要是Ni异常;F8因子主要是Sn异常;F9因子主要是Bi异常。选择以Au为主的F1因子得分做累加综合异常图(图1)。

在F1因子得分综合异常图中,有10个主要异常区(Z1~Z10),其异常主要分布在右上半部分,构成西北和东南走向异常带与线性构造基本一致,Z2和Z4两个异常与已知矿区基本吻合(图1)

图1 R型因子分析F1因子组合异常等值线图

Fig11 F1factorsyntheticanomalycontourmapwithR

-factoranalysis

120

吉 林 地 质 第27卷

表1 全部样品正交旋转因子载荷矩阵

Table1 Loadmatrixoforthogonalrotationfactorforallsamples

F1

AuAgCuPbZnMnMoCoNiSnAsSbBi

018199010570161901100-0104001080011130102601003-00143101029%

F5801015-010480106901057301008-01058010890101665010933114%

F3-011740124001907014640105601243-01008-010460101017-01137010434111%

F4-0111301214-01017010990105701304019530110109601009-01032010694916%

F50103201080-01015010490103801010113201122-01004-01052010505712%

F601066-0103301028012351970001007010150108101046-01015010126416%

F7-01018010270103601100-01940105101181019500103701191-01098010237112%

F8-01019-010210104210981076-01262010960116901037019280113701074-010017715%

F901017-01045010230113001011-01036010730106301022-010020116701070019848312%

累计方差贡献

312 马氏距离地球化学综合异常

依据公式(3)至(4),计算样品的马氏距离

2

D,以剔除异常样品后的正常总体的马氏距离上线值Dα为异常下限,利用所有样品的马氏距离D做地球化学综合异常图(图2)

2

2

区(M1~M10),其异常主要分布在图幅上半部分,与线性构造一致,西北和东南走向异常带更为明显,M2~M8两个异常与已知矿区基本吻合(图2)。

篇11:B样条分层离散插值在磁测异常处理中的应用

B样条分层离散插值在磁测异常处理中的应用

在地球物理探测中,由于受地形条件等因素的影响,大量的观测和采样是在极不规则并且离散的测网下进行的.为了更合理地对地球物理异常做出正确的解释,在保持原有场特征的前提下,有必要插值出均匀并且较密集网格下的数据.B样条分层离散插值方法可实现将离散并且稀疏的数据插值到均匀并且密集的网格上.该方法建立了一组控制点间距逐步减半的`网格层,同时利用B样条改进控制点网格层对于所有离散数据的估计来优化多层离散插值.该方法在理论模型中进行了测试,取得了预期的效果;然后,应用到两组地球物理磁测异常的实际资料处理和解释中,验证了被严格理论模型所保证的优异性,取得了很好的效果.该方法可以推广到整个地球物理资料的处理和解释中.

作 者:江玉乐 李才明 张朝霞 JIANG Yu-le LI Cai-ming ZHANG Zhao-xia  作者单位:成都理工大学,四川,成都,610059 刊 名:西南石油大学学报  ISTIC PKU英文刊名:JOURNAL OF SOUTHWEST PETROLEUM UNIVERSITY 年,卷(期): 29(4) 分类号:P318.4 关键词:B样条   离散数据插值   地球物理勘探   磁异常  

篇12:程序开发中微服务架构和容器的结合运用论文

程序开发中微服务架构和容器的结合运用论文

摘要:文章分析了微服务架构和容器技术的应用。微服务架构是一种架构概念, 通过将功能分解到各个离散的服务中以实现对解决方案的解耦, 在降低系统耦合的同时, 还提供了十分灵活的服务支持, 这种架构对应用的功能进行了充分的分离, 使开发和部署非常的便捷, 结合容器技术, 最大化地解决微服务架构中所面临的负载, 对微服务进行更有效的支撑。微服务架构中对容器技术的应用主要看中容器的对解决复杂环境和用户资源隔离问题的能力, 这种新的开发方式为开发者提供了一种新的思路。

关键词:微服务; 容器; 共享; 解耦

微服务架构的产生是软件架构不断演进的结果。Web开发经历了单体结构, 集群结构, 分布式系统, 最终演化到微服务架构。微服务架构按照业务划分模块, 实现一个个高度解耦的系统架构, 其中的分布式、快速演化、自动化运维和高容错性这些优点, 受到了大批互联网公司的青睐。在保障软件架构的灵活伸缩, 系统架构分布合理的同时, Docker容器的加入, 进一步降低了微服务的成本, 反过来也使得微服务和容器结合得越来越紧密。特别是云端平台的兴起, 加速了这种趋势[1]。

1 设计架构的演变。

1.1 单体结构。

此时公司业务量比较小, 系统构建并不复杂, 所有的代码, 数据库, 文件都部署在一台机器上, 对系统服务进行常规的应用服务和数据服务分离, 增加缓存可以满足此时的访问量。

1.2 集群结构。

公司业务逐渐增加, 用户量增大, 服务器压力也随之增大, 高峰期已经不能满足用户的操作, 于是增加服务器分担原有服务器的访问和压力, 同时有了负载均衡, 反向代理, 数据库读写分离的应对方案。

1.3 分布式系统。

公司业务继续发展, 用户规模和业务复杂已经到了一个量级, 于是开始把一个系统拆成许多不同的应用, 每个应用进行独立的开发、测试、运维, 应用之间通过消息队列来进行数据分发, 也可以访问同一个数据存储来构成一个关联完整的系统。

1.4 微服务架构。

微服务架构以去中心化为特点。大规模用户的使用需求, 对分布式系统的要求很高, 并且业务快速发展, 迭代周期很短, 子系统也不需要如原来企业计算分布式那样采用集中式存储, 通常采取前后端分离的方式, 使单个业务系统组件化, 不同的服务之间采用轻量级的交互机制进行交互, 使各个子系统做到有效分割, 结合Docker容器, 使得微服务能进行实际的应用。

2 微服务的特性。

2.1 微服务架构的优势。

2.1.1 降低复杂性。

微服务架构通过分解单体式应用为多个服务方法, 降低了系统的复杂性, 多个子系统的分离实现了组件化, 一个个组件成为可管理的分支或服务, 使其通过模块化的方式呈现出来。通过微服务这种架构模式, 让单个服务更容易开发和维护。

2.1.2 部署的独立性。

每个微服务都具备相对独立的运行进程和业务处理的能力, 所以每个微服务的安装和部署都可以独立进行。在传统的架构中, 如果要对某一程序内的某一功能区进行变更, 就需要对整体架构进行统一的重新建设, 并进行重新部署。而微服务架构在变更时, 由于其单个微服务的独立性, 不需要对整个应用进行编译和部署, 这大大提高了效率, 也降低了对系统环境所造成的风险, 缩短了原有的时间操作周期。

2.1.3 容错性高。

在传统单一的构架中, 如果某一组的应用功能发生故障, 那么系统整体的稳定性就会受到影响, 子系统出现故障, 影响会在其他的子系统中蔓延, 轻的后果是会导致局部的系统受到影响, 部分业务无法得到处理, 严重的后果是导致整个应用系统的崩溃。在微服务构架中, 由于单个服务的独立性, 所以故障的影响可以控制在单个的应用中, 并不会对其他的服务造成影响, 而且微服务中有提前审计的功能, 有多种机制可以保证应用运行的稳定[2]。

2.1.4 技术灵活。

微服务构架有多种技术的选择, 常见的Java, Node Js, Python, React Native都可以实现具体的微服务逻辑, 也可以混合使用。通过对技术的合理选择, 节省成本的同时, 做到专业分工。在使用不同的技术对微服务架构进行整合和部署的过程中, 由于微服务的相对简单, 在升级的时候面临更小的破坏风险, 微服务的技术重构也更具有可行性[3]。

2.1.5 易扩展。

微服务的架构中, 系统的独立性比较强, 保证了系统的扩展性也比较强, 其扩展的方向也相对较多, 在横向的扩展中可以使相同维度的业务实现无缝衔接, 当不同的组件间接口出现差异的时候, 其独立性也可以大大降低衔接的复杂性。在纵向的方向上, 组件化也使得多个维度的业务能有序地进行数据交互, 微服务架构的特点大大降低了扩展风险。

2.2 微服务架构面临的问题。

微服务的复杂性主要体现于分布式这种架构方式上。由于应用的是分布式系统, 给开发时带来了天然的系统复杂性。开发者需要在RPC或消息传递之间选择进程间通信机制, 更甚于开发者必须平衡消息传递过快或者过慢的问题, 显然这加大了服务的复杂性[4]。

另一个挑战是数据库分区架构。在微服务的应用中, 应用需要同时服务多个数据库。No SQL数据库和信息代理的机制的系统, 并不支持分布式交易, 这对开发者带来了很高的挑战。

3 容器技术。

容器技术的使用, 使得微服务器架构中所面临的压力得到很大程度上的缓解。容器技术的特点为微服务构架提供了落地的机会, 其中的内核机制可以实现不同的容器之间的联系, 容器之间资源也能实现完全的隔离, 它们中有一个典型的代表—Docker。

容器技术的高速发展为计算机的云计算问题提供了解决的可能, 现在多重容器技术都已经成为容器的.标准规范。Linux容器具有较多的功能, 也实现了十分规范的管理。微服务通过将单个应用程序分解, 实现了组件化, 又通过Kubemetes等技术将原有的集群统一地编织在一起, 提供应用的部署、维护、扩展机制等功能, 实现对不同容器的有效管理[5]。

Docker是容器技术中的代表, 特点体现在具有标准的镜像结构, 实现了对不同资源实行不同存储的功能, 也能满足大规模的托管服务, 对于有主机集群的云服务平台, 通过分解应用构建、发布等方式实现对云计算技术的开发, 在实现云计算平台的构建的同时, 还可以进行优化和自动化维护环境, 使得工作的效率能够得到有效的提升, 在降低成本的同时, 满足了微服务架构所需要的资源。

Docker的体系中, 最关键的有两个, Docker Register和Docker Engine, 前者负责构建和分发应用镜像, 后者负责构建容器。这种组合方式, 是云服务的软件即服务 (Software as-a-Service, Saa S) 理念, 用户可以在各自的数据中心内建立私有的Docker Register, 形成属于自己的私有集群, 以应对大规模的应用扩展需求[6]。Docker很像一个集装箱, 通过Lxc技术先进行整合镜像, 再集中汇总进行分发。

普通的虚拟机与容器技术有一定的相似性, 但是容器技术在很多细节和虚拟机并不相同。虚拟机建立在硬件平台上, 而容器技术建立在操作系统 (Operating System, OS) 上, 可以把容器看作是虚拟机轻量化的实现。Docker在实现应用隔离的同时, 没有虚拟机必须的虚拟化管理层, 对比虚拟机太长的启动时间, 容器的启动与停止可以在毫秒级这个范围内启动。比较这些特性, Docker容器显然更胜虚拟机一筹。

4 基于容器的微服务应用。

Docker的细粒度松散耦合和微服务架构相得益彰。我们可以让Docker容器装载这样一个场景功能, 按照不同的角色分类, 每一个容器里装一个服务和应用, 一个服务器中运行多个容器, 也可以将多个容器分散到多个服务器上运行。整个项目架构按照业务逻辑的规划以细粒度的方式分散到了各个Docker中, 并可以根据Rest接口的方式进行整合联动[7]。一个典型的例子可以是负载均衡层、综合业务服务层、单业务服务层、存储层。这种多分层的方式, 可以很好地保证容器对微服务的支持, 高效地保证每一层服务的运行。当然, 这种应用方式也是有些许弊端, 在架构设计的前期, 需要花费较多时间来进行详细的系统分析和逻辑划分。

5 结语。

微服务架构和容器的结合在程序开发中应用已经成为一种新的开发方式, 通过不同的微服务实现业务架构的粒度化, 通过不同的容器承载不同的业务, 为用户提供更多的开发选择。微服务构架中采用容器技术后, 一方面更加微型化;另一方面容器使微服务开发更加的便捷。这种开发方式将随着时间的推移越来越流行。

参考文献

[1]杨鸥, 张羿, 耿贞伟.微服务架构在容器云中的应用实践[J].电脑与电信, (7) :79-81.

[2]张晶, 黄小锋, 李春阳.微服务框架的设计与实现[J].计算机系统应用, 2017 (6) :259-262.

[3]王纪军, 张斌, 顾永生, 等.云环境中Web应用的微服务架构评估[J].计算机系统应用, 2017 (5) :9-15.

[4]刘为.微服务架构及相应云平台解析[J].科教导刊, 2017 (1) :27-28.

[5]佚名.容器+微服务成为驱动混合IT关键[J].邮电设计技术, 2017 (1) :5.

[6]黄小锋, 张晶.微服务框架介绍与实现[J].电脑与信息技术, (6) :14-16.

[7]王健, 李冬睿.从单一模式系统架构往微服务架构迁移转化技术研究[J].科教导刊, 2016 (9) :43-44.

篇13:程序开发与实例结合教学法在VB教学中的应用论文

摘要:Visual Basic是一门程序开发语言,但大多数教师都单纯采用实例教学,而忽视了程序开发这一环节,使学生不能学以致用。本文针对这一问题,提出应将“程序开发”与“实例教学”结合起来。

关键词:程序开发;实例教学;VB教学

“实例教学”是VB教学中最常用的一种教学方法,实例教学法将知识点贯穿在实例中,通过实例的讲解达到传授知识、技能的目的。实例教学法体现了以教为中心的教学特点。而“程序开发”是一种创新型、思维开拓型的教学法,在教学活动中,以开发程序为目标,学生在教师组织、引导下,通过单个窗体的任务探究,达到对所学知识点的掌握和操作技能的培养。“程序开发”教学体现了以学为主的教学特点。VB是一门实践性强、技能性强而且极富创造性的课程,在教学过程中,要把“实例教学”和“程序开发”结合运用,以教师为主导,学生为主体,充分发挥这两种教学方法的优势,更好地完成教学任务。

教学模式

第一阶段:导入教师在还没有讲授新课之前,向学生演示几个用VB开发出来的小程序和系统。要求这些程序和系统不仅要有代表性,还要有吸引力。并告诉学生这学期学习VB的最终目的:要以一个系统程序(这里以图书管理系统为例)为主线,通过多个实例教学最终完成这个系统的开发。目的明确了,在学生心目中就会产生学习的原动力。

第二阶段:需求分析和可行性研究程序开发的目的就是使工作变得更有效率。应让学生理解到程序不是随随便便就能开发出来的,需要做大量的前期工作。教师和学生可以一起对图书管理系统做测试,即管理者要能对书籍信息、读者信息和借阅信息进行增、删、改、查及对系统进行管理,还要满足使用者对书籍进行有效的查询。综合起来就是看能不能满足用户的需求,如果不能还要补充哪些功能。让学生根据实际补充和更正,这就极大地促进了学生的积极性和能动性,使教学更加顺利和流畅。这一阶段要让学生懂得开发程序要做大量的分析工作,程序不是以做完为目的,最终要投入到使用中。

第三阶段:总体设计和详细设计总体设计,即教师要将这个大工程细分成一个个子窗体,明确每个子窗体的作用并安排布局;详细设计,即根据每个子窗体所含的知识点选择典型实例和设计任务进行系统教学,让学生将知识点运用到系统中。在以上两个设计中,主要工作是通过“实例教学”来讲解VB中的知识点,开始时先让学生以设计窗体界面为主,了解属性、方法及动作的应用。学生在学习这一块内容时有一个接受新鲜事物的过程,授课的内容不能脱离例题系统的界面,即要以例题系统的界面为中心,围绕它展开学习。调动学生将学过的内容运用于开发图书管理系统中去,学生会有非常大的热情开发属于自己的东西。这时教师应该引导学生,系统的功能并不是越多越好,能满足需要就可以了;设计时的布局要讲究合理搭配,界面的设计要让使用者感到舒服。对于代码的编写,这一过程要分三个阶段:

(1)要让学生对原系统中的代码有所掌握和理解,知道每个语句代表的意思;

(2)在教师的指导下,让学生对原代码进行适当改写以观察产生的效果,并从中得到进步;

(3)以学生自主尝试,教师引导的.方式,让学生大胆实践,使他们在尝试中体会、感受和领悟。这期间,学生的理解掌握能力和创新能力各不相同,一定会遇到一些问题。对学生存在的共性问题,可由教师统一示范,集体解决;对个别学生的个别问题可作单独辅导,并鼓励学生通过各种渠道如查阅图书、网络、杂志去收集资料和解决问题。这是学生消化和吸收知识的阶段,是学生由不会到会,由初识到熟练掌握的阶段,也是学生充分发挥各种能力的阶段,时间上可占整个教学进度的一半左右,在教学进程中是一个热烈的高潮期。

第四阶段:程序的测试由于工作量大,难免会在程序的编写中出现问题而导致不能正常运行。要举例让学生知道一些错误产生的原因。如产生“变量未定义”的原因就是控件的属性名称与代码中引用的名称不相符。可修改属性中的Name属性,也可修改程序中的代码。在这个阶段的初始,学生不会修改错误,教师要适时地进行引导说明,并统一讲解出现的共性错误,得出正确结果,让学生记忆深刻。当然错误的原因很多,不可能一一举出实例,这就要求学生互相帮助,解决更多的问题。

教学过程中,程序开发和实例教学是相辅相成的,程序开发是个大框架,离不开实例的讲解,实例的讲解有利于加深对知识点的消化吸收乃至整个系统的完成。所以要不断收集学生在完成实例过程中的反馈信息,从而动态地调整两者的使用。

篇14:程序开发与实例结合教学法在VB教学中的应用论文

通过教学实践表明,在VB课程中采用程序开发与实例结合的教学方式效果是明显的,主要体现在以下几个方面:

(1)采用这种教学法,摆脱了以往单纯以实例教学为主出现的不足。学生不再对程序开发感到陌生,他们能将所学的知识结合起来,产生更多的想法和新念头,为以后的学习和就业铺垫新路。

(2)采用这种教学法,使教学以现实目标为中心,具体、生动,学生目标明确,能够充分发挥学生的能动作用,充分调动学生的学习热情,使学生在开发程序的过程中掌握基本知识与技能,并培养了学生的自主学习能力。

(3)在整个的开发过程阶段,学生除了通过自主探索的方式完成任务外,还可通过协作学习的方式对某些问题进行交流、讨论、沟通,从而开阔学生的思路,提高学生的综合实践素质和敢于创新、团结合作的精神。

(4)学生在学习途中遇到困难时,可通过查找书本、网上资料等解决问题,使学生学习的内容更多、更深,知识面更广,提高自学能力。

运用程序开发与实例结合教学法需要注意的几个问题

选好例题系统整个教学过程实质上是由若干个子程序串联而成的,所有的教学活动都围绕系统展开。因此,系统的设计、编排非常关键,直接影响教学效果。系统选择时要注意两个问题:

(1)选择的系统要让学生在生活中对其了解、熟悉,激发学生的学习兴趣。

(2)由于学生是技校生,系统的选择不能太难、太大,要兼顾基础性和研究性,让不同层次的学生均学有所获,让有创新思维的学生有可开拓的空间。

教师必须进行角色转换在教学实施过程中,已经形成了“以系统为中心点、教师为主导、学生为主体”的基本特征,因此教师必须进行角色转换。角色转换要从讲授、灌输转变为组织、引导,从讲台上讲解转变为走到学生中间与学生交流、讨论。教师在整个课堂教学中是组织者和实施者,教师的主导性主要体现在学生学习的方向、内容、过程、结果和质量上,起引导、规范、评价和纠正的作用。教师要充分了解学生,在学生学习遇到困难时,教师应该为学生搭起桥梁;在学生学习不够主动时,给学生提出问题,引导学生去探究;在学生完成基本任务后,调动学生的创作欲望,进一步完善任务创作;在任务完成后及时做好评价工作。

参考文献:

[1]林陈雷,郭安源,葛晓东.Visual Basic教育信息化系统开发实例导航[M].北京:人民邮电出版社,2003.

[2]庞维国.自主学习[M].上海:华东师范大学出版社,2003.

网络论文

网络爬虫论文范文

电力系统职称论文

公路工程的职称论文

建筑工程职称论文范文

建筑行业职称论文

硕士 教师 评语

硕士导师推荐信范文

土木工程毕业论文评语导师评语

硕士导师对学生的评语

程序开发中异常的理解及处理异常论文
《程序开发中异常的理解及处理异常论文.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

【程序开发中异常的理解及处理异常论文(推荐14篇)】相关文章:

压力性尿失禁SUI的研究论文2023-02-01

工作评价2022-11-10

基于数据抽取与订阅实现数据共享分析及研究论文2023-07-21

硕士 导师 评语2023-10-07

机械机电设备维护论文2023-09-13

谈实验异常设置对实验教学的甄别作用论文2022-05-30

浅论乡村债务现状成因及化解对策论文2022-04-30

网络安全数据可视化概述的论文2022-05-07

数据可视化工作简历2023-05-02

试论司法交易行为的市场化论文2022-05-08