为什么Catch(例外)几乎总是一个坏主意?

为什么catch(Exception)几乎总是一个坏主意?

因为当你发现exception时你应该正确处理它 。 你不能指望在你的代码中处理所有types的exception。 当你捕获所有exception时,你可能会得到一个无法处理的exception,并阻止堆栈中较高的代码正确处理它。

总体原则是要抓住最具体的types。

简短的故事:它被称为bug掩蔽。 如果你有一段运行不好的代码,并且抛出exception(或者你把错误的input传递给那段代码),并且你只是通过捕获所有可能的exception而瞎了眼睛,你实际上就不会发现这个bug并修复它。

如果你能正确处理它们,你应该只捕获exception。 由于你不能正确处理所有可能的例外,你不应该抓住他们:-)

因为你不知道为什么会发生exception,有几个例外需要非常特殊的汽车才能正确处理(如果可能的话),比如OutOfMemoryException和类似的低级系统exception。

因此,你应该只是捕捉exception:

  • 你知道如何处理它(例如FileNotFoundException左右)
  • 当你以后再重新提出时(例如执行故障后清理)
  • 当你需要将exception传输到另一个线程

这取决于你需要什么。 如果您需要以不同的方式处理不同types的exception,那么您应该使用多个catch块,并尽可能多地捕获特定的exception。

但有时你可能需要以相同的方式处理所有exception。 在这种情况下,catch(Exception)可能会正常。 例如:

  try { DoSomething(); } catch (Exception e) { LogError(e); ShowErrorMessage(e); // Show "unexpected error ocurred" error message for user. } 

这可能是java特定的:

有时你需要调用抛出检查exception的方法。 如果这在你的EJB /业务逻辑层中,你有两个select – 抓住它们或重新抛出它们。

捕获特定的exception类意味着当你看看这个代码如何处理exception时,你将需要重新分析你的操作。 你经常会陷入“如果……”的情况,如果exception得到正确的处理,那么你可以花费大量的精力。

重新抛出意味着调用你的EJB的代码将被捕获的代码所淹没,这通常对调用类没有任何意义。 从EJB方法中引发已检查的exception将意味着您有责任手动回滚任何事务。

除了@anthares的回答:

因为当你发现exception时你应该正确处理它 。 你不能指望在你的代码中处理所有types的exception。 当你捕获所有exception时,你可能会得到一个无法处理的exception,并阻止堆栈中较高的代码正确处理它。

总体原则是要抓住最具体的types。

catch(Exception)是一个不好的做法,因为它捕获所有的RuntimeException(未经检查的exception)。

但是有时候也行! 就像如果你有一段代码做了一些“额外的”,你真的不关心,你不希望它炸掉你的应用程序。 例如,我最近在一个大型应用程序上工作,我们的业务合作伙伴希望将某个日常事务汇总到一个新的日志文件中。 他们解释说,日志对他们来说不是那么重要,而且也不符合要求。 这只是额外的东西,可以帮助他们理解正在处理的数据。 他们不需要它,因为他们可以在其他地方获得信息。 所以这是一个罕见的情况下,捕捉和吞食exception是完全正确的。

我也曾经在一个所有Throwables都被捕获的公司工作过,然后在一个自定义的RuntimeException中重新生成。 我不会推荐这种方法,只是指出已经完成了。