需要权威的来源,为什么你不应该抛出或捕获java.lang.Exception

Dea*_*lze 6 java exception-handling

我在短短一个多小时内就完成了编码标准会议,我需要快速回答这个问题.

有经验的Java程序员之间的共同点是你不会抛出或捕获java.lang.Exception(除了极少数例外 - 没有双关语意).你不这样做的原因是声明

catch (java.lang.Exception ex) {...}
Run Code Online (Sandbox Code Playgroud)

也将捕获未经检查的异常,并且在大多数情况下,这不是预期的.

我们已经有很多遗留代码由现有团队成员编写,他们捕获java.lang.Exception的子类,记录错误,并将子类重新抛出为java.lang.Exception.

我需要说服他们

  1. 他们需要停止编写这样的代码.
  2. 需要修复使用此反模式的现有代码

2号意味着相当数量的重构.

这将缩短参数会上,如果我可以显示通过Java社区的重量级人物,使这个点(即约书亚·布洛克,詹姆斯·高斯林)之一的一篇文章或博客条目.到目前为止,我的google-fu还没有找到任何东西.

有没有人知道一个受人尊敬的Java大师的文章或博客说你不应该抛出或捕获java.lang.Exception?

非常感谢快速回答.

院长

Jes*_*per 6

这里有一些东西:Java技巧134:当捕获异常时,不要把你的网络太宽(JavaWorld)

约书亚布洛赫的有效Java(第二版)可能在第9章(例外)中有一些内容,尽管我无法快速找到任何关于不捕捉的内容Exception.

以下是来自JavaWorld的关于这个问题的问答(也指向Java技巧134) - 它也解释了为什么有时你必须打破不捕捉Exception或甚至不能捕捉的规则Throwable.


Kev*_*vin 5

请参阅Brian Goetz(并发向导)中的这篇文章,他有自己的洞察力,并在Effective Java中引用Josh Bloch


Gil*_*ili 0

我想重点是,如果您不知道如何处理特定的异常,那么您不应该捕获它。它应该传播到更高的级别,希望它知道如何处理它。过早捕获异常会导致异常被默默地吞噬,并且除了记录之外无法对它们做任何有用的事情。

想象一下,如果FileInputStream您尝试打开一个不存在的文件,但没有向您的代码表明此失败,则 的构造函数会在内部记录异常,会发生什么。记录错误没什么问题,但您的代码希望捕获此异常并对其执行一些有用的操作(例如提示用户输入新文件名)。如果他们对catch (Exception)你来说就无法做到这一点。