【问题标题】:Which java.lang.Error descendant are safe to catch?哪个 java.lang.Error 后代可以安全捕获?
【发布时间】:2013-10-03 19:53:04
【问题描述】:

我很清楚,通常 Java 程序不应该捕获 Throwable,因为它像 OutOfMemoryError 一样捕获 Error-s。 100% 清晰。

但是。

如果我有一个多线程应用程序,通常最好的做法是我应该有一个UncaughtExceptionHandler,如果RuntimeExceptionError 发生,它会做一些事情。我通常想做的就是简单地记录。记录RuntimeExceptions 不会有什么伤害,这很清楚。但问题出现在我身上:

我可以在 UncaughtExceptionHandler 中捕获和安全记录哪些错误,如果我记录它,它不会处理我的整个应用程序?存在哪些错误,并不意味着应用程序必须立即停止?

例如,如果我得到一个OutOfMemoryError,我只需要一个printStackTrace 来标准输出,因为记录它的内存需要可能会杀死其他线程。但是在我看来,StackOverflowError 被记录是完全安全的,因为这意味着当前线程的堆栈区域已满。记录它是安全的。 您还会记录哪些其他Error 后代?

【问题讨论】:

    标签: java error-handling uncaught-exception throwable uncaughtexceptionhandler


    【解决方案1】:

    如果你可以用它做一些建设性的事情,任何 Throwable 都是安全的。任何不能做有用的事情的 Throwable 都不应被捕获。

    顺便说一句:为了捕获所有日志记录,我catch(Throwable) 用于日志记录,因为我知道剩余的代码会丢弃 Throwable/Error/Exception。

    【讨论】:

    • 我不明白“当我知道它会丢弃它时”。部分。 “它”是什么意思?
    • @GáborLipták “它”是指 Throwable,如错误或异常。
    • 呵呵。我刚刚意识到,这部分包含两次“它”。所以我的意思是第一个“它”。这是什么意思?
    • @GáborLipták 我已经替换了“它”;)
    猜你喜欢
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多