当前位置: 首页 > 面试题库 >

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

何志业
2023-03-14
问题内容

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

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

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


问题答案:

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

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

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

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

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

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



 类似资料:
  • 问题内容: 在最近的项目中,我建议在测试工具代码中捕获RuntimeException并将其记录下来。该代码处理来自数据库的一系列输入,并且我不希望由于任何一个输入(空值,非法参数等)失败而导致测试停止。不用说,我的建议引起了热烈的讨论。 捕获任何一种RuntimeException是否可以接受?如果是,那么可以捕获RuntimeExceptions的其他方案还有哪些? 问题答案: 捕获此异常的原

  • 问题内容: 有效的Java建议我们不要这样做 。总是对的吗? 在许多情况下,仅捕获身体。 如果我不接听电话,如何检查发生的地点? 而且,如果我抓住了但身体空了,那我们那时就无法获得任何堆栈信息,可以吗? 更新 我分析了在Google Android源AOSP4.2.2_r1.2中捕获RuntimeException的统计信息。 有249个RuntimeException捕获,并且以下是catch-

  • 我必须用一些代码来回答这个问题: 假设我编写了以下方法规范: 您正在为一个将使用此方法的数据库程序编写代码,并且希望专门处理每个程序。try/catch子句应该是什么样的 您可以对catch子句内容使用no-ops——空块{}<我们只对这里语句的语法和结构感兴趣。 我回答说: 出于这个原因,他没有接受这个答案: “你的catch子句顺序不对。你能解释一下为什么顺序很重要吗?” 他的回答正确吗?

  • 问题内容: 在Java中,引发 检查 异常(Exception或其子类型- IOException,InterruptedException等)的方法必须声明 throws 语句: 不声明语句的 方法不能 引发检查的异常。 但是在Java中使用安全方法捕获检查的异常仍然合法: 其实没有 有点可笑:编译器知道 e 不是检查的异常,因此可以将其重新抛出。事情甚至有些荒谬,此代码无法编译: 第一个片段是

  • 我正在查看Java SE7的新功能,目前我正在: http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html 关于捕获多重功能,当我遇到这个语句时: 注意:如果一个捕捉块处理多个异常类型,那么捕捉参数是隐式最终的。在这个例子中,捕捉参数ex是最终的,因此您不能在捕捉块中给它赋值。 我从未注意到

  • 问题内容: 我一直在阅读JLS,并且遇到了11.1.3节。我引用的异步异常是: 大多数异常是由于它们所发生的线程的操作而同步发生的,并且在程序中被指定为可能导致此类异常的某个点处发生。相反,异步异常是在程序执行的任何时候都可能发生的异常。 和 异步异常仅由于以下原因而发生: […] * Java虚拟机中的内部错误或资源限制,阻止其实现Java编程语言的语义。在这种情况下,引发的异步异常是Virtu