20150704 星期六 北京
使用异常可以增加可靠性,但是过分使用异常就会导致问题不断.
(异常的设计原则是在不正常的的情况下处理,如果可以把不正常的情况改变为正常思路下的部分,那么可以减少异常处理.不正常是特例,正常才是主流.)
一个方法抛出过多受检异常,调用此方法就必须处理这些异常或者抛出继续传播,不论何种处理,都增加程序开发的负担.
如果方法只抛出一个受检异常,这种情况下,是否有别的路径避免使用受检异常呢? 把"受检异常变成未受检异常"的方法是,把抛出异常的方法分解为两个方法,一个方法返回boolean,表示是否应该抛出异常.案例如下:
try {
obj.action(args);
} catch (TheCheckedException e) {
....
}
重构后
if (obj.actionPermitted(args)) {
obj.action(args);
} else {
//...
}
虽然重构并不恰当,但是在恰当的地方,会是使API更加舒服和灵活.
如果对象缺少外部同步情况下被并发访问,或者被外界修改状态,这种重构就是不恰当的,因为actionPermitted和action调用时间间隔中,对象状态可能发生变化.
如果actionPermitted必须重复action中的方法,出于性能考虑,这种API的重构不值得去做.