在开发过程中如何在一个地方捕获来自不同线程的所有未捕获异常?

14 浏览
0 Comments

在开发过程中如何在一个地方捕获来自不同线程的所有未捕获异常?

我有一个不小的多线程应用程序,包括GUI和socket通信。在开发过程中,我发现有时候会有一些未捕获和记录的异常。如果有异常,我必须盯着控制台才能发现。有没有办法在一个地方(比如main()函数)捕获并记录这些来自不同线程(包括EDT)的未捕获异常?我在main()函数中使用try-catch来捕获Throwable,但没有起作用。

编辑:

更具体地说,我使用Executors.newCachedThreadPool()来创建Runnable线程池。在许多情况下,我不想使用Callable,因为我不想阻塞调用线程。那么,我该如何捕获这些Runnable线程中的异常呢?

另外,我该如何捕获Swing EDT中的未捕获异常?

0
0 Comments

在一个大型复杂程序中,捕捉不同线程抛出的异常并不是一个简单的问题,因为没有办法从抛出异常的线程中捕捉到异常。你必须确保程序中的每个线程都有一个处理程序,能够捕捉并报告所有异常。

如果你控制创建所有线程的代码,那么这很容易实现,但如果你调用的是为你创建线程的库函数,就会更加困难。如果幸运的话,这些库函数可能会让你提供一个ThreadFactory,从而允许你的代码在它们创建新线程时获得控制权。

即使你能确保每个线程都有一个正确处理未捕获异常的处理程序,你仍然可能会有一些代码隐藏在某个地方(可能是你调用的某个第三方库),它会捕捉异常并忽略它。

祝你好运!

那是完全不正确的说法。我建议你不要对你不熟悉的主题写答案。异常会传播/冒泡,事实上非常容易捕捉所有异常,请查看问题下的第一个评论。

当异常“冒泡”到不是你的代码时,捕捉异常并不容易,当异常在不是你的代码中被捕捉并忽略时,也不容易捕捉异常。

那是一个完全不同的故事,与普通的未捕获异常无关。

0
0 Comments

在开发过程中,我们经常会遇到不同线程抛出的未捕获异常。这会导致异常信息分散在各个线程中,不方便进行统一处理。那么问题来了,如何在开发过程中捕获所有未捕获的异常并集中处理呢?

一个解决办法是设置一个自定义的UncaughtExceptionHandler来处理未捕获的异常。使用Thread类的setDefaultUncaughtExceptionHandler方法可以设置这个处理器。当线程由于未捕获的异常即将终止时,JVM会调用这个处理器。

以下是示例代码:

Thread.setDefaultUncaughtExceptionHandler((Thread t, Throwable e) -> {
    System.out.println(t + " throws exception: " + e);
});

对于Swing EDT的情况,可以参考这里的解答。

以上解决方案适用于一些线程,但是如果还涉及到线程池和Swing EDT,如何处理呢?请参考我的编辑。

通过设置自定义的UncaughtExceptionHandler来捕获所有未捕获的异常可以解决这个问题。

0