为我的应用程序的所有线程定义一个全局UncaughtExceptionHandler


问题内容

我想在Java应用程序中定义一个应用程序级别 UncaughtExceptionHandler
,如果在应用程序的一个线程中引发了未捕获的异常,则会调用该应用程序级别。我知道有可能为一组线程(ThreadGroup)定义一个未捕获的异常,而我实际上正在使用它,但是我想为
尚未定义自己的未捕获的异常处理程序的线程定义一个全局未捕获的异常。未与定义了默认异常处理程序的一组线程关联

因此,例如,我想达到这样的目标:

1° LEVEL ---> Call thread own UncaughtExceptionHandler ---> 2° LEVEL Call Thread Group UncaughtExceptionHandler ---> 3° LEVEL Call application(default) UncaughtExceptionHandler

简单来说,我想覆盖默认的UncaughtExceptionHandler并定义我自己的处理程序,而不是在System.err(这是默认行为)上打印堆栈跟踪。

例如,在C#.NET中,我在应用程序的Main()方法中执行了类似的处理 未处理线程异常 事件处理程序的操作:

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);

甚至可以用Java完成吗?

如何覆盖Java中的默认UncaughtExceptionHandler?


问题答案:

Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler
ex)

这应该可以实现您想要的。

正如医生所说

设置当线程由于未捕获的异常而突然终止并且没有为该线程定义其他处理程序时调用的默认处理程序。

还有关于您在ThreadGroup中使用处理程序的有趣注释(也在文档中)

请注意,默认的未捕获异常处理程序通常不应遵从线程的ThreadGroup对象,因为这可能导致无限递归。