16

我想在我的 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 ?

4

2 回答 2

19

Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler ex)

这应该可以实现您正在寻找的东西。

正如医生所说

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

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

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

于 2011-12-02T20:40:34.323 回答
5

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

于 2011-12-02T20:42:55.793 回答