最近,我们在Java服务器应用程序中遇到了一个问题,该应用程序正在抛出未捕获的错误,因为Error是Throwable的一个单独的子类,而我们仅捕获了Exceptions。
我们通过捕获Throwables而不是Exceptions解决了眼前的问题,但这使我思考为什么您要捕获Exceptions而不是Throwables,因为您随后会错过Errors。
那么, 当您可以捕获Throwables时 , 为什么还要捕获异常 ?
捕获错误后,这完全取决于您将如何处理错误。通常,捕获错误可能不应被视为“正常”异常流的一部分。如果您确实抓住了一个问题,那么您就不应该考虑“好像什么也没发生一样继续进行”,因为JVM(和各种库)将使用Errors来表示“确实发生了严重的事情,我们需要尽快关闭”。通常,最好在他们告诉您即将结束时听他们讲。
另一个问题是,是否可以从错误中恢复,可能取决于特定的虚拟机,而您可能无法控制。
就是说,在一些极端的情况下,安全和/或希望捕获Error或至少某些子类是可取的:
因此,最重要的是:如果您确实捕获了Throwable / Error而不是Exception,那应该是一个 明确定义的情况,您知道自己在“做一些特别的事情” 。
编辑:可能这很明显,但是我忘了说,实际上, JVM可能实际上不会 在Error上 调用您的catch子句 。我肯定已经看到Hotspot在捕获某些OutOfMemoryErrors和NoClassDefFoundError方面的尝试很轻松。