一尘不染

当您可以捕获Throwables时,为什么还要捕获Java中的异常?

java

最近,我们在Java服务器应用程序中遇到了一个问题,该应用程序正在抛出未捕获的错误,因为Error是Throwable的一个单独的子类,而我们仅捕获了Exceptions。

我们通过捕获Throwables而不是Exceptions解决了眼前的问题,但这使我思考为什么您要捕获Exceptions而不是Throwables,因为您随后会错过Errors。

那么, 当您可以捕获Throwables时为什么还要捕获异常


阅读 241

收藏
2020-09-09

共1个答案

一尘不染

捕获错误后,这完全取决于您将如何处理错误。通常,捕获错误可能不应被视为“正常”异常流的一部分。如果您确实抓住了一个问题,那么您就不应该考虑“好像什么也没发生一样继续进行”,因为JVM(和各种库)将使用Errors来表示“确实发生了严重的事情,我们需要尽快关闭”。通常,最好在他们告诉您即将结束时听他们讲。

另一个问题是,是否可以从错误中恢复,可能取决于特定的虚拟机,而您可能无法控制。

就是说,在一些极端的情况下,安全和/或希望捕获Error或至少某些子类是可取的:

  • 在某些情况下,您确实确实希望停止正常的流程:例如,如果您在Servlet中,则可能不希望Servlet运行器的默认异常处理程序向世界宣布您遇到了OutOfMemoryError,无论是还是不是,你可以从中恢复过来。
  • 有时,如果JVM可以从错误原因中完全恢复,则将抛出错误。例如,如果尝试分配数组时发生OutOfMemoryError,至少在Hotspot中,看来可以安全地从中恢复。(当然,在其他情况下,可能会抛出OutOfMemoryError,这是不安全的尝试尝试。)

因此,最重要的是:如果您确实捕获了Throwable / Error而不是Exception,那应该是一个
明确定义的情况,您知道自己在“做一些特别的事情”

编辑:可能这很明显,但是我忘了说,实际上, JVM可能实际上不会 在Error上 调用您的catch子句
。我肯定已经看到Hotspot在捕获某些OutOfMemoryErrors和NoClassDefFoundError方面的尝试很轻松。

2020-09-09