将java.lang.Error抛出主线程是否典型?

时间:2018-04-12 01:17:28

标签: java multithreading exception exception-handling

根据documentation

  

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

我正在使用一个库来捕获并忽略用户回调中的所有Throwable。我想知道是否应该为其他线程中的所有Throwable添加一个catch块以记录这些失败。我想避免工作线程静默死亡然后主线程继续的情况。这是我应该关注的一个场景吗?

1 个答案:

答案 0 :(得分:0)

  

我正在使用一个库来捕获并忽略用户回调中的所有Throwable。

@ shmosel的评论正指向正确的方向:

  

为什么不注册未捕获的异常处理程序?

当然,你只需注册一个自定义的未捕获的异常处理程序就无法实现任何目的 - 由于写得不好的库正在吞噬它们,所以异常无法到达它!

要解决这个问题,你应该重写每个“用户回调”:将回调代码包装在try-catch中,并将收到的Throwable传递给未捕获的异常处理程序:

try {
    // the code of your callback goes here
    ...
} catch (Throwable error) {
    // if you don't control individual Threads, consider using a
    // Thread.getDefaultUncaughtExceptionHandler instead
    Thread thread = Thread.currentThread();

    thread.getUncaughtExceptionHandler().uncaughtException(thread, error);
}

理想情况下,这应该由库来完成,它调用你的回调, - 使用Thread的全局异常处理程序来处理来自用户代码的意外异常是执行者和应用程序服务器经常使用的常见模式。

与此同时,请联系第三方库并建议开发人员解决该问题 - 默默地吞下异常绝对是一个坏主意!