119 Star 1K Fork 296

lin-mt / effective-java-third-edition

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
第77项:不要忽略异常.md 2.70 KB
一键复制 编辑 原始数据 按行查看 历史
lin-mt 提交于 2019-12-19 20:41 . 修订77、78项

不要忽略异常

  尽管这条建议看上去是显而易见的,但是它却常常被违反,因而值得重复提出来。当 API 的设计者声明一个方法将抛出某个异常的时候,它们是在试图告诉你某些事情。所以,不要忽略它!要忽略一个异常非常容易,只需要将方法调用通过 try 语句包围起来,并包含一个空的 catch 块:

// Empty catch block ignores exception - Highly suspect!
try {
    ...
} catch (SomeException e) {
}

  空的 catch 块会使异常达不到应该有的目的 ,【目的】就是强迫你处理异常的情况。忽略异常就如同忽略火警信号一样——如果把火警信号器关掉了,当真正的火灾发生的时候,就没有人能够看到火警信号了。或许你会侥幸逃过劫难,或许结果是灾难性的。每当看见空的 catch 块时,应该警钟长鸣。

  在某些情况下,是可以忽略异常的,例如,当关闭 FileInputStream 的时候忽略异常可能就是合适的。你尚未更改文件的状态,因此无需执行任何恢复操作,并且你已经从文件中读取了所需要的信息,因此没有理由中止正在进行的操作。把异常记录下来还是明智的做法,因为如果这些异常经常发生,你就可以调查异常的原因。如果您选择忽略异常,catch 块应该包含一个注释,解释为什么这样做是合适的,并且该变量应该被命名为 ignore

Future<Integer> f = exec.submit(planarMap::chromaticNumber);
int numColors = 4; // Default; guaranteed sufficient for any map
try {
    numColors = f.get(1L, TimeUnit.SECONDS);
} catch (TimeoutException | ExecutionException ignored) {
    // Use default: minimal coloring is desirable, not required
}

  本项中的建议同样适用于受检异常和未受检的异常。不管异常代表了可预见的异常条件,还是编程错误,用空的 catch 块忽略它,将会导致程序在遇到错误的情况下悄然地执行下去。然后,有可能在将来的某个点上,当程序不能再容忍与错误源明显相关的问题时,它就会失败。正确地处理异常能够彻底挽回失败。只要将异常传播给外界,至少会导致程序快速失败,从而保留了有助于调试该失败条件的信息。

其他
1
https://gitee.com/lin-mt/effective-java-third-edition.git
git@gitee.com:lin-mt/effective-java-third-edition.git
lin-mt
effective-java-third-edition
effective-java-third-edition
master

搜索帮助