gpt4 book ai didi

java - 既然可以捕获 Throwables,为什么还要在 Java 中捕获异常?

转载 作者:IT老高 更新时间:2023-10-28 20:21:07 27 4
gpt4 key购买 nike

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

我们通过捕获 Throwables 而不是 Exceptions 解决了当前的问题,但这让我想到了为什么你会想要捕获 Exceptions 而不是 Throwables,因为那样你会错过错误。

那么,为什么要捕捉异常,什么时候可以捕捉 Throwables

最佳答案

这在一定程度上取决于您在发现错误后将如何处理它。一般来说,捕获错误可能不应该被视为“正常”异常流程的一部分。如果你确实捕获了一个,你不应该考虑“像什么都没发生一样继续”,因为 JVM(和各种库)将使用错误作为一种信号方式,表明“发生了非常严重的事情,我们需要尽快关闭”。一般来说,最好在他们告诉你末日临近时听他们说。

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

也就是说,在某些极端情况下,捕获错误或至少某些子类是安全和/或可取的:

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

所以底线是:如果您确实捕获 Throwable/Error 而不是 Exception,那么它应该是一个明确定义的情况,您知道自己正在“做一些特别的事情”

编辑:这可能很明显,但我忘了说,在实践中,JVM 可能实际上不会在错误时调用您的 catch 子句。我确实看到 Hotspot 巧妙地掩盖了捕获某些 OutOfMemoryErrors 和 NoClassDefFoundError 的尝试。

关于java - 既然可以捕获 Throwables,为什么还要在 Java 中捕获异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/581878/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com