异常设计的初衷就是针对程序的不正常情形所使用的,不要使用异常来控制程序的执行流程
Java设计了三种可以抛出的结构
error一般情况下,约定俗称有虚拟机使用,表示资源不足等错误
对可恢复的情况使用受检异常,对编程错误使用非受检异常
使用checked exception会给客户端程序员带来很大的负担,只有满足如下两个条件,才应该使用checked exception
否则,应该使用runtime exception
重用现有的异常,有三个好处
常用的异常有如下几个
当方法要传递底层实现抛出的异常时,要进行异常转译,不要使底层实现的异常污染了上层api
例如
catch(IOException e){
throw new ServiceException(e);
}
通常有两种转译方式,一种是直接异常的转译,一种是异常链的转译
上面的例子就是异常链的转译,调用方可以通过异常获得更底层的异常,方便排查问题,直接转译就是不传递异常链,例如
catch(IOException e){
throw new ServiceException("io exception");
}
以上只是针对一定要传递底层异常情况下的处理方法,对于底层的方法,首选方案是处理掉底层异常,不将异常的影响传递到上层去,一般有两条途径来实现
为checked exception和unchecked exception都建立文档说明,但是不要在方法声明中标记unchecked exception
要记录下产生该异常的各种原因,最好能使异常自身记录下产生问题的原因,例如在异常的构造函数中包含一些特别的字段,就像在IndexOutOfBoundsException中可以有如下构造方法
public IndexOutOfBoundsException(int lowerBound, int upperBound, int index){
...
失败的方法调用应该使对象保持在被调用之前的状态,有几种途径可以实现这个目的
有时,并不总能实现失败的原子性,例如两个线程不安全的并发修改对象的状态
规范上来讲,任何调用失败都应该使对应状态位于之前的状态,如何有不一致,应该在文档中描述出来
对于异常,除了关闭InputStream时,其他时候都不要忽略异常
对异常
此建议对于checked 和unchecked异常都使用
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/ro_wsy/article/details/47066437