- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java中Exception的处理
简述
?
?
用Java在开发系统的时候,Exception的处理往往是比较复杂的。如何处理开发中遇到的Exception,如何将合理的异常信息呈现给客户是开发人员必须要考虑的问题。
?
?
关于Exception的处理的文章在很多地方都可以看到,本文除了做一个总结之外,还将结合Design by Contract,JDK 1.4引入的assertion,以及如何用Spring的AOP处理Exception做进一步的探讨。
?
?
Exception的分类
?
?
从JDK的API中我们可以看到,Java把异常分为了Error和Exception两大类,在Exception中又分为checked exception和runtime exception。从系统开发的角度上,我们可以把exception分为:
?
?
????????? JVM异常。这种异常我们不应该捕捉,因为它的出现意味着一些比较严重的错误,比如OutOfMemoryError,StackOverflowError等;
????????? 系统异常。大多数情况下,系统异常以RuntimeException的形式出现,比如NullPointerException, ArrayOutOfBoundsException等,这时往往意味着我们的程序里面出现了Bug;还有一种情况,例如我们没有办法通过JNDI找到某个资源,也应该属于系统异常。系统异常的主要特点是,当我们遇到这种异常的时候,我们没有合适的办法处理,或者说我们不能已一个合理的方式告诉最终用户系统出现了什么错误。很难想象用户看到一个NPE,并在界面上看到一堆stack trace是什么感觉。这种异常应该在单元测试以及集成测试的时候被检测到,在发布的时候应该尽可能不出现这样的问题;
????????? 应用异常。这种异常是由我们的系统,或者第三方系统种抛出的异常,这些异常的出现对用户来说,可能是因为某个验证没有通过,某个操作的步骤出现错误等,比如插入数据库的时候出现主键重复的情况等。总之,这些异常的信息可以通过一个用户看的懂的方式显示给用户。
?
?
Design By Contract(DBC)
?
?
我们暂时把Exception的处理放在一边,先看看Design by Contract的概念。
?
?
对于任何一个软件系统来说,一个重要的目标就是可靠性,即正确性和健壮性。系统的正确性主要看这个系统是不是符合Specificatoin,健壮性主要是指当遇到Specification没有涉及的情况,即异常情况的时候能不能以一种合理的方式解决。
?
?
DBC的主要思想是一个类和它的客户程序之间有一个合同;客户程序必须保证调用这个类之前某些前提条件必须满足(Precondition),而这个类必须保证在被调用之后的某些属性和状态是正确的(Postcondidtion/Class Invariants)。如果能有一种方式能够让编译器检查这些Precondition和Postcondition是否正确,这个合同是否被满足,那么出现的错误可以被立即捕获。
?
?
例如,一个类需要一个setMonth( int month )的方法,我们一般的实现方法大致如下:
public
void setMonth( int month )
{
if( month 0 month 13 )
{
throw new IllegalArgumentException( “” );
}
this.month = month;
}
?
?
但是按照DBC的概念,应该由客户代码,而不是setMonth方法保证传进来的参数是一个正确的数值,而setMonth应该保证当方法执行之后,month的值被正确设置,同时保证该类处在一个正确的状态。所以setMonth中对于参数month的验证就不在这里出现了。从这个例子中可以看到,DBC的引入对不同类的责任有一个明确的划分,原来的代码里面setMonth的责任现在被转移到了客户代码里面。
?
?
目前,编程语言中对DBC支持较好的是Eiffel,而在JDK1.4中引入的assertion则为Java在DBC方面提供了一些支持。
?
?
Java Assertion
?
?
Java虽然不直接支持DBC,但我们可以利用JDK1.4提供的assertion功能做一些这方面的工作。下面简单介绍assertion的用法,详细的信息请参见sun网站上的资料(/j2se/1.4.2/docs/guide/lang/assert.html)。
?
?
Assert有两种用法
????????? assert BooleanE
文档评论(0)