09 异常(69-77)

Wu Jun 2020-01-02 15:51:27
05 Java > 02 Effective Java

第 69 条:只针对异常的情况才使用异常

如果在 try、catch、finally 块中都抛出了异常,只是只有一个异常可被传播到外界。

请不要在 try 块中发出对 return、break 或 continue 的调用,万一无法避免,一定要确保 finally 的存在不会改变函数的返回值(比如说抛异常、return 以及其他任何引起程序退出的调用)。因为那样会引起流程混乱或返回值不确定,如果有返回值最好在 try 与 finally 外返回。

如果构造器调用的代码需要抛出异常,就不要在构造器处理它,而是直接在构造器声明上 throws 出来

第 70 条:对可恢复的情况使用受检异常,对编程错误使用运用时异常

第 71 条:避免不必要地使用受检异常

第 72 条:优先使用标准异常

第 73 条:抛出与抽象对象相对应的异常

处理底层异常最好的方法首选是阻止底层异常的发生,如果不能阻止或者处理底层异常时,一般的做法是使用异常转换(包括异常链转换),除非底层方法碰巧可以保证抛出的异常对高层也合适才可以将底层异常直接从底层传播到高层。

第 74 条:每个方法抛出的异常都要有文档描述

如果一个方法可能抛出多个异常类,则不要使用“快捷方式”声明它会抛出这此异常类的某个超类。永远不要声明一个方法“throws Exception”,或者更糟的是声明“throws Throwable”。

要为你编写的每个方法所能摆好出的每个异常建立文档,对于未受检和受检异常,以及对于抽象的和具体的方法也都一样。

第 75 条:异常信息中要包含足够详细的异常细节消息

第 76 条:努力使失败保持原子性

作为方法规范的一部分,任何一个异常都不应该改变对象调用该方法之前的状态,如果这条规则被违反,则API文档中应该清楚的指明对象将会处于什么样的状态。

第 77 条:不要忽略异常

空的 catch 块至少应该包含一条说明,用来解释为什么忽略这个异常是合适的。