【问题标题】:Why should not we catch Errors in Java? [duplicate]为什么我们不应该在 Java 中捕获错误? [复制]
【发布时间】:2013-02-20 22:34:24
【问题描述】:

我知道,它会损害应用程序的性能,但我们不应该围绕代码的地方,这确实有风险,例如

try {
    // code        
} catch (OutOfMemoryError ex) {
    // handling code
}

看起来很安全。

来自文档:

错误是 Throwable 的子类,表示存在严重问题 一个合理的应用程序不应该试图捕捉。

为什么不呢?

【问题讨论】:

  • 你真的试过这样处理吗?
  • 我的猜测是应该避免而不是处理这些错误。通过捕捉这些东西,你掩盖了一个非常重要的潜在问题。
  • 可能这个问题已经涵盖了:stackoverflow.com/questions/352780/…
  • 这是无意义的代码sn-p。
  • @defaultlocale 谢谢你的链接!

标签: java error-handling


【解决方案1】:

您通常不应该尝试处理这些错误的原因是因为通常您对它们无能为力。

它们往往是 JVM 级别的错误,而不是应用程序级别的错误 - OutOfMemory 就是一个很好的例子。如果 JVM 内存不足,你的程序会做什么?即使你确实抓住了它,也不能保证处理代码将以一致的方式完成/继续,因为抛出了终端条件

【讨论】:

    【解决方案2】:

    您可以捕获任何可抛出的内容,这意味着您可以捕获错误。但是错误代表一个严重的问题,不建议捕获。

    来自 Java API:

    “错误是 Throwable 的子类,表示合理的 > 应用程序不应尝试捕获的严重问题。大多数此类错误是异常情况。 >ThreadDeath 错误虽然是“正常”情况,但也是错误,因为大多数 >应用程序不应尝试捕获它。”

    Error 表示您的应用程序存在一些严重问题。例如,当Java Virtual Machine 由于内存不足而无法分配对象时,将抛出OutOfMemoryError,并且垃圾收集器无法提供更多内存。因此,如果通过捕获OutOfMemoryError 除了increasing the memory 之外不会解决您的实际问题,并且通过在程序中捕获此错误可能不会导致任何解决方案,而是会导致容易出错的应用程序。因此,不建议捕获错误。

    【讨论】:

      【解决方案3】:

      Error 类型实际上我们无法猜测这会出现在perticular block of Code 中,如下所示。

      try {
          // not guaranty OutOf memeroy Exception will come from this block      
      } catch (OutOfMemoryError ex) {
          // handling code
      }
      

      这就是我们不处理的原因。

      【讨论】:

        【解决方案4】:

        当 JVM 不再按预期工作或即将运行时,会出现错误。如果你捕捉到一个错误,并不能保证catch块会运行,更不能保证它会运行到最后。

        还要看运行的电脑,当前的内存状态,所以没办法测试,尽力而为吧。你只会有一个危险的结果。

        您还将降低代码的可读性。

        【讨论】:

        • 我知道你说的是If you catch an error, there is no guarantee that the catch block will run, and even less that it will run till the end.,但在任何地方都可以证明这种说法吗?给我指向某个地方的链接?
        • docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.3 ; 此错误在被检测到时会异步传递(第 2.10 节),并且可能在程序中的任何位置发生:如果 jvm 出错,它就会出错。如果电源关闭,jvm 就会死掉。在发现错误之前,您可能无法生存。
        【解决方案5】:

        如果你的堆空间或 perm gen 空间已满,那么捕获 OutOfMemoryError 并在你的 catch 块中做一些工作是什么意思?实际上,您无法猜测此异常实际上会发生在哪里。没有逻辑可以捕获此异常。

        【讨论】:

          猜你喜欢
          • 2011-03-15
          • 1970-01-01
          • 2016-02-10
          • 2014-08-08
          • 1970-01-01
          • 2012-10-20
          • 1970-01-01
          • 2018-11-21
          • 2011-09-13
          相关资源
          最近更新 更多