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



