Don't Group Exception Catchers

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

有时我们会重新抛出异常。在Java中,我们比其他语言更经常这样做,因为它有检查异常。有时我们必须捕获并重新抛出在方法中来自不同位置的几个异常。Java 7引入了在单个catch块中对不同类型异常的分组。但即使没有分组,也可以只捕获IOException甚至Exception,并为所有类型和所有抛出者(抛出异常的方法)提供一个catch块。最近我意识到这是一种不好的做法。以下是原因。

考虑这个Java方法(我在使用Apache Commons IO):

这还不够完美。让我们按照之前的建议,重新修改它以提供更多的错误上下文。

这里,异常可能在三个地方抛出:

无论是谁抛出异常,我们都在同一个catch块中捕捉到,并以相同的消息重新抛出。我认为这是不好的,因为通过重新抛出提供的错误上下文更少地关注了发生的问题。

我建议进行以下重构(我没有关闭输入流,这是错误的,但这是另一个讨论话题):

这段代码更长,但同时更便于调试、测试和在生产模式中使用。catch块能够更好地解释情况,并在重新抛出异常时提供更好的上下文,因为它只处理一个单独的情况。

因此,我建议的规则是:如果捕获到异常,每个发起者都必须有自己的catch块。

显然,我认为在单个catch块中将异常类型分组是不好的实践。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 14:56

sixnines availability badge   GitHub stars