什么时候可以接受 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
一样,就像从每个方法返回对象一样,你输了身份。
如果这两件事在您正在处理的项目中很常见,也许您应该考虑向高级开发人员提及。
我继承的其中一个项目充满了成吨的 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
一样,就像从每个方法返回对象一样,你输了身份。
如果这两件事在您正在处理的项目中很常见,也许您应该考虑向高级开发人员提及。