目录

Java 异常注意事项

目录

Core Java 中谈及使用异常机制时简易的技巧:

  1. 异常处理不能代替简单的测试 一般来说,异常处理流程比起简单的测试会花费更多时间,只应该在发生“异常”状况时使用异常。
  2. 不要过分细化异常 过分细化异常(使用多个 try-catch 结构)会让代码急剧膨胀,代码的花括号嵌套变多,易读性也十分糟糕。尤其当多个异常状况相邻时,使用 1 个 try 块包裹所有语句,同时后缀不同 catch 块是更好的做法。
  3. 利用异常层次结构 不要为逻辑错误抛出已检查(checked)异常,也不要抛出顶级异常。如果必要,将底层异常包裹转换成自定义的或描述更清晰的异常。
  4. 不要压制异常
  5. 检测错误时,“苛刻”要比放任更好 如有必要,尽可能早地抛出异常。比如:对于某些特定操作,返回 null 类型,再在调用的地方检测并抛出 NullPointerException 是不好的做法。
  6. 不要羞于传递异常 如果可以,尽量在高层地地方处理异常、通知用户、修正命令,这样更加符合逻辑,代码更易读。

规则 5、6 可以合并为“早抛出,晚捕获”。

另外,书中还有其他提及地知识没有列出:

  1. 尽量使用有资源地 try 块,方便自动关闭以及捕获全部异常

注意:多个资源赋值语句使用 分号; 隔开

  1. 多个异常地处理方法相同时,不要使用父类异常,而是使用多异常捕获语句
1
2
3
4
5
try {
    // 抛出异常
} catch (TypeAException | TypeBException e) {
    // 捕获异常
}
  1. 包装异常再抛出时如果可以,最好携带原始信息
1
2
3
4
5
6
7
try {
    // 抛出异常
} catch (TypeAException e) {
    TypeBException anotherException = new TypeBException("...");    // 异常信息
    anotherException.initCause(e);
    throw anotherException;
}