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

时间:2011-12-02 20:38:31

标签: java exception exception-handling uncaught-exception

如果在我的应用程序的一个线程中抛出未捕获的异常,我想在我的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?

2 个答案:

答案 0 :(得分:16)

Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler ex)

这应该可以实现您的目标。

正如文件所说

  

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

关于你在ThreadGroup中使用处理程序的一个有趣的说明(也在文档中)

  

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

答案 1 :(得分:5)

您需要设置默认的未捕获异常处理程序。这是一个名为setDefaultUncaughtExceptionHandler的Thread类的静态方法。这样做会为运行的应用程序设置异常处理程序。除非另有说明,否则它将是任何新线程的默认值。