欢迎来到天天文库
浏览记录
ID:30778069
大小:119.00 KB
页数:8页
时间:2019-01-03
《java异常处理的误区和经验总结》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Java异常处理的误区和经验总结误区一:异常的选择图1.异常分类图1描述了异常的结构,其实我们都知道异常分检测异常和非检测异常,但是在实际屮又混淆了这两种异常的应用。由于非检测异常使用方便,很多开发人员就认为检测异常没什么用处。其实异常的应用情景可以概括为以下:1、调用代码不能继续执行,需要立即终止。出现这种情况的可能性太多太多,例如服务器连接不上、参数不止确等。这些时候都适用菲检测界常,不需要调用代码的显式捕捉和处理,而且代码简洁明了。2、调用代码需要进一步处理和恢复。假如将SQLException定义为非检测异常,这样操作数据时开发人
2、员理所当然的认为SQLException不需要调用代码的显式捕捉和处理,进而会导致严重的Connection不关闭>Transaction不回滚、DB中岀现脏数据等情况,正因为SQLException定义为检测异常,才会驱使开发人员去显式捕捉,并且在代码产生异常后清理资源。当然清理资源后,可以继续抛岀非检测异常,阻止程序的执行。根据观察和理解,检测异常大多町以应用于工具类中。误区二:将异常直接显示在页面或客户端将异常直接打印在客户端的例子屡见不鲜,以JSP为例,一旦代码运行出现异常,默认情况下容器将异常堆栈信息直接打印在页面上。其实从客户
3、角度来说,任何异常都没有实际意义,绝大多数的客户也根本看不懂异常信息,软件开发也要尽量避免将异常直接呈现给用户。清单1packagecom.ibm.dw.sample.exception;/***自定义RuntimeException*添加错误代码属性*/publicclassRuntimeExceptionextendsjava」ang.RuntimeException{〃默认错误代码publicstaticfinalIntegerGENERIC=1000000;〃错误代码privateIntegererrorCode;publicRu
4、ntimeException(lntegererrorCode,Throwablecause){this(errorCode,null,cause);}publicRuntimeException(Stringmessage,Throwablecause){〃利用通用错误代码this(GENERIC,message,cause);}publicRuntimeException(lntegererrorCode,Stringmessage,Throwablecause){super(message,cause);this.errorCode
5、=errorCode;}publicIntegergetErrorCode(){returnerrorCode;}}正如示例代码所示,在异常中引入错误代码,一旦出现异常,我们只要将异常的错误代码呈现给用户,或者将错误代码转换成更通俗易懂的提示。其实这里的错误代码还包含另外一个功能,开发人员亦可以根据错误代码准确的知道了发生了什么类型异常。误区三:对代码层次结构的污染我们经常将代码分Service>BusinessLogic>DAO等不同的层次结构,DAO层中会包含抛出异常的方法,如清单2所示:清单2publicCustomerretrie
6、veCustomerByld(Longid)throwSQLException{〃根据ID查询数据库}上面这段代码咋一看没什么问题,但是从设计耦合角度仔细考虑一下,这里的SQLException污染到了上层调用代码,调用层需要显式的利用try-catch捕捉,或者向更上层次进一步抛出。根据设计隔离原则,我们可以适当修改成:清单3publicCustomerretrieveCustomerByld(Longid){try{〃根据ID查询数据库}catch(SQLExceptione){〃利用非检测异常封装检测异常,降低层次耦合throwne
7、wRuntimeException(SQLErrorCode,e);}finally{〃关闭连接,清理资源}}误区四:忽略异常如下异常处理只是将异常输出到控制台,没有任何意义。而且这里出现了异常并没有屮断程序,进而调用代码继续执行,导致更多的异常。清单4publicvoidretrieveObjectByld(Longid){try{//..somecodethatthrowsSQLException}catch(SQLExceptionex){/***了解的人都知道,这里的异常打印毫无意义,仅仅是将错误堆栈输出到控制台。*而在Produ
8、ction环境中,需要将错误堆栈输岀到H志。*而且这里catch处理之后程序继续执行,会导致进一步的问题*/ex.printStacktrace();}可以重构成:清单5publicvoidr
此文档下载收益归作者所有