本文着重介绍了 Java 异常选择和使用中的一些误区,希望各位读者能够熟练掌握异常处理的一些注意点和原则,注意总结和归纳。只有处理好了异常,才能提升开发人员的基本素养,提高系统的健壮性,提升用户体验,提高产品的价值。
误区一、异常的选择
图 1. 异常分类
图 1 描述了异常的结构,其实我们都知道异常分检测异常和非检测异常,但是在实际中又混淆了这两种异常的应用。由于非检测异常使用方便,很多开发人员就认为检测异常没什么用处。其实异常的应用情景可以概括为以下:
一、调用代码不能继续执行,需要立即终止。出现这种情况的可能性太多太多,例如服务器连接不上、参数不正确等。这些时候都适用非检测异常,不需要调用代码的显式捕捉和处理,而且代码简洁明了。
二、调用代码需要进一步处理和恢复。假如将 SQLException 定义为非检测异常,这样操作数据时开发人员理所当然的认为 SQLException 不需要调用代码的显式捕捉和处理,进而会导致严重的 Connection 不关闭、Transaction 不回滚、DB 中出现脏数据等情况,正因为 SQLException 定义为检测异常,才会驱使开发人员去显式捕捉,并且在代码产生异常后清理资源。当然清理资源后,可以继续抛出非检测异常,阻止程序的执行。根据观察和理解,检测异常大多可以应用于工具类中。
误区二、将异常直接显示在页面或客户端。
将异常直接打印在客户端的例子屡见不鲜,以 JSP 为例,一旦代码运行出现异常,默认情况下容器将异常堆栈信息直接打印在页面上。其实从客户角度来说,任何异常都没有实际意义,绝大多数的客户也根本看不懂异常信息,软件开发也要尽量避免将异常直接呈现给用户。
清单 1
package com.ibm.dw.sample.exception;/** * 自定义 RuntimeException * 添加错误代码属性 */publicclassRuntimeExceptionextendsjava.lang.RuntimeException{ //默认错误代码 publicstaticfinal Integer GENERIC = 1000000; //错误代码private Integer errorCode; publicRuntimeException(Integer errorCode, Throwable cause){ this(errorCode, null, cause); } publicRuntimeException(String message, Throwable cause){ //利用通用错误代码this(GENERIC, message, cause); } publicRuntimeException(Integer errorCode, String message, Throwable cause){ super(message, cause); this.errorCode = errorCode; } public Integer getErrorCode(){ return errorCode; } }
正如示例代码所示,在异常中引入错误代码,一旦出现异常,我们只要将异常的错误代码呈现给用户,或者将错误代码转换成更通俗易懂的提示。其实这里的错误代码还包含另外一个功能,开发人员亦可以根据错误代码准确的知道了发生了什么类型异常。
圣诞节就要来了,送给java程序员一个有含金量的礼物!
【2年以上java项目经验高薪专场招聘会】
时间:2016年12月18日(周日)14:00-17:00
地点:北京市海淀区中鼎大厦B座
费用:免费
什么?你说你还没有2年以上项目经验,咱2年以后约,
当然,现在推荐符合条件的小伙伴报名,且他成功入职,
你将获得价值200元的现金/实物奖励!