基于Java语言的异常处理机制的研究

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于语言的异常处理机制的研究

摘要:是一种面向对象的程序设计语言,其异常处理机制是语言的一大特色。本文讨论了的异常处理机制,并指出了异常处理机制使用中的常见错误模式及注意事项,以便更好的利用解决实际问题。

关键字:; 异常; 异常处理机制; 错误模式

引言:异常是一个运行时错误。在不支持异常处理的计算机语言中,错误必须被手工检查和处理——典型的是通过错误代码的运用等等,这种方法既笨重又麻烦。的异常处理机制避免了这些问题,采用面向对象的方法来管理运行时错误。

1、异常处理思想的由来

异常即程序运行时出现的非正常情况。在程序的运行过程中随时都有可能发生错误的可能。这些错误可能是由于包含不合法的输入数据所造成的,或者是数组越界存取,还可能是因为试图使用空引用来引用对象。当这些错误发生时,通常希望程序能够智能化地处理,而不会导致系统的崩溃或数据的丢失。错误处理的终极任务就是将错误从发生地传递到能够处理它的地方。

图、传统的错误处理方式

在传统的非面向对象的编程语言中,错误处理的任务全落在程序员身上,这样做有两个去缺点,一是程序员的负担过重,二是出错处理不规范,不利于程序员之间的协作沟通,而且降低了程序的可读性。在中使用异常为程序提供了一种有效的错误处理方式,使得方法的异常中止和错误处理有了一个清晰的接口:当一个方法引发一个异常之后,可以将异常抛出,由该方法的直接或间接调用者处理这个异常。这就是常说的 (捕获抛出)方式。这种处理方式使得错误的处理规范化,程序员可以用一致的方式来处理错误。

2、的异常处理机制

异常处理机制基于三中操作:声明异常、抛出异常和捕获异常。具体见图。

声明异常告诉编译程序哪里可能出错。当一个语句引起错误时,含有这个语句的方法就

会创建一个异常对象并将它传递给系统。异常对象包含有关异常的信息,包括它的类型和出错时程序的状态。一个方法抛出异常后,运行系统开始寻找用来处理错误的代码。处理错误的代码称为异常处理器,从当前的方法开始,通过方法调用链向后搜索,查找这一代码。处理器必须与抛出的异常类型相匹配,如果未发现异常处理器,程序就会中止。任何不是被你程序捕获的异常最终都会被系统提供的默认处理程序处理。默认处理程序显示一个描述异常的字符串,打印异常发生处的堆栈轨迹并且终止程序。

3、异常处理机制的规则

具体而言的异常处理通过个关键字控制:、、、和。想要进行异常监控的代码被包含在一个块中。如果在“”块中发生异常,它被抛出。程序代码可以捕捉这个异常(用)并且用某种合理的方法处理该异常。系统产生的异常在运行时被系统自动引发。手动引发一个异常,用关键字。任何被引发方法的异常都必须通过子句定义。任何在方法返回前绝对被执行的代码都被放置在块中。下面是一个异常处理的通常形式:

{ }

( ) { }

( ) { }

{ }这里,是发生异常的类型。声明抛出异常:在中程序可以用语句引发明确的异常。语句的通常形式为:“;”。在方法中声明异常:在子句中,可以声明方法中可能出现的异常从而告诉编译器它可能会产生哪些异常,从而要求用户必须考虑对这些异常的处理。一旦异常被抛出,程序控制由块转到块。执行永远不会从块“返回”到块。一旦执行了和它的语句,程序控制从整个机制的下面一行继续。不能单独使用,子句的目的是解决异常情况并且像错误没有发生一样继续运行。无论在块中是否产生异常,也不管产生的异常是否会被捕获,中的语句最终会被执行。另外要指出一点的是,子句是可选的,可以有也可以无。每一个语句至少需要一个或子句。

4、异常使用中的错误模式

异常淹没

程序捕获了一个异常,但在后面并没有对这个异常进行处理或处理不当,使得异常信息难以捕捉甚至消失,从而造成异常信息淹没。

.1.1 忽略异常

捕获了一个异常,但是在块中没有代码,对异常不作任何处理,忽略异常处理会使程序泄露意想不到的状态信息。故障模式举例如下:

{ () ;}

( ) { }

.1.2 消失的异常

支持语法。不论异常是否抛出模块总是在模块后执行。但是如果模块包含一个语句,则会抑制异常的抛出,造成异常丢失。故障模式举例如下:

{ () ;}

{ () { ;} }

.1.3 不使用具体的异常

极度通用的…块是另一种形式的异常淹没,在方法中不是抛出适当的异常,而是普通的或者。由于绝大多数异常都直接或间接从派生,( )就相当于说我们想要处理几乎所有的异常。普通的异常使调用者不知道具体发生了什么异常,增加了恰当处理问题的难度。故障模式举例如下:

{ …}

( ) { () ;

异常使用不当

程序中捕获所有异常是一个好想法,但在程序中太广泛地捕获异常或对其使用不正确则会影响程序的执行效率甚至威胁程序的安全。

4.2.1 程序捕获了非检查类异常

使用程序捕获、等非检查异常。故障模式举例如下:{ () ;}

( ) { }

.2.2 异常的产生导致锁无法释放

程序中的位置不恰当。程序在内部发生异常,以致()将无法调用,上了锁之后不释放引起死锁。正确的处理是在中显式释放。故障模式举例如下:

() { ();();

{ (); }

( ){ (""); }

(); }

在控制流中使用异常

只为异常条件使用异常。异常只是用在异常条件下,不能用于正常的控制流。将异常用于控制流会降低代码的可维护性和可读性。故障模式举例如下:

{ ();

(){ ()();…} }

相关文档
最新文档