Java 异常处理的误区和经验总结

 本文着重介绍了 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元的现金/实物奖励!


50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信