这一切都取决于你在捕获它后会对错误做些什么.通常,捕获错误可能不应被视为“正常”异常流程的一部分.如果你确实抓住了一个,你就不应该考虑“继续进行,好像什么也没发生”,因为JVM(和各种库)将使用错误作为一种信号“发生真正严重的事情并且我们需要尽快关闭“.一般来说,最好在他们告诉你结束的时候听他们说.
另一个问题是,错误的可恢复性与否可能取决于特定的虚拟机,这是您可能控制或不能控制的.
也就是说,有一些极端情况是安全和/或希望捕获错误,或者至少是某些子类:
>在某些情况下,您确实希望停止正常的流程:例如,如果你在Servlet中,你可能不希望Servlet runner的默认异常处理程序向全世界宣告你有一个OutOfMemoryError,无论你是否可以从中恢复.
>有时,如果JVM可以从错误原因中干净地恢复,则会抛出错误.例如,如果在尝试分配数组时发生OutOfMemoryError,至少在Hotspot中,您似乎可以安全地从此恢复. (当然还有其他情况可能会抛出OutOfMemoryError而不能安全地尝试使用它.)
所以底线是:如果你确实捕获了Throwable / Error而不是Exception,那么它应该是一个明确定义的情况,你知道你正在“做一些特殊的事情”.
编辑:可能这很明显,但我忘了说在实践中,JVM实际上可能不会在Error上调用catch子句.我肯定看到Hotspot明显地掩盖了捕获某些OutOfMemoryErrors和NoClassDefFoundError的尝试.