什么时候可以接受 throwing/catching 一般异常

When is throwing/catching general exception acceptable

我继承的其中一个项目充满了成吨的 try/catch 方块,吸引了将军 Exception。我一直在缓慢但肯定地重构它,但有太多,以至于我一直在考虑在会议上将其作为一个问题提出来。这让我开始思考......是否真的存在在生产环境中捕获一般异常是合理的情况?我想不出我需要捕捉一般异常的情况,但我也是一个相当新的毕业生,我确信有很多我不知道的东西。我做了一些研究,我可以找到很多为什么不捕获一般异常的原因,但没有具体说明这种做法何时合理。显然,如果您正在调用一个已经抛出 Exception 的方法,您必须捕获它。但是有没有什么方法可以抛出 Exception 并且不应该重构它来抛出特定异常的原因?

仅在需要时抛出Exception,特别是Exception。如果你抛出 too-general 一个异常,你实际上只是在喊 "there is a problem",而没有给出关于问题是什么的具体信息。

Catch Exception 只有 如果 Exception 被抛出,特别是。如果您捕捉到过于笼统的异常,您将失去以正确方式处理特定异常的机会。

Throwing Exception 相当于 returning Object 而不是 more-specific 类型,这对调用者有用;捕获 Exception 相当于将 return 值分配给 Object 变量,而不是您可以用来做有用事情的更具体的类型。基本上:您正在丢弃可用的类型信息。

有时您不得不抛出Exception,因为您正在编写一个通用框架。比如Callable.call抛出Exception,因为你不知道那里会执行什么代码,所以允许它抛出Exception意味着你不约束[=的用户57=]。因此,如果您调用 Callable,则需要捕获 Exception;但你需要小心。

绝大多数人不会(或不应该)编写框架,因此您不应该抛出或抓住 Exception

Effective Java 的第 61 项“抛出适合抽象的异常”中对此有很好的建议(这是第 2 版中的数字;不要'知道第 3 版)。基本上:你几乎肯定不想抛出 Exception,但你可能想要抛出 IOException 而不是 FileNotFoundException,如果你正在阅读 ]file 与您的 API.

无关

捕获一般 Exception 不是最佳实践,因为如果您正在捕获异常,则表示您可以处理它并从该异常状态中恢复,但如果您无法恢复,则可能是失败总比继续在非常不可预测的状态下工作要好。

可能发生的另一件事是捕获本应在更高级别处理的异常,这可能再次导致危险状态。

有可能代码是在 Java 7 之前编写的,当时 multi-catch 被引入,所以他们使用 Exception 而不是分别编写,或者开发人员对此不熟悉.

只有捕获 Exception 是合理的情况,至少在我看来,是在应用程序的顶部(main) - 捕获所有未在较低级别处理的异常,记录它们并出于安全原因退出,并正常崩溃并向最终用户显示合理的消息。

这给我们带来了另一件事,那就是抛出Exception,就像捕获一个你不应该抛出的Exception一样,就像从每个方法返回对象一样,你输了身份。

如果这两件事在您正在处理的项目中很常见,也许您应该考虑向高级开发人员提及。