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

Java 为应用程序的所有线程定义一个全局UncaughtExceptionHandler,java,exception,exception-handling,uncaught-exception,Java,Exception,Exception Handling,Uncaught Exception,我想在我的Java应用程序中定义一个应用程序级别UncaughtExceptionHandler,如果在我的应用程序的一个线程中抛出一个UncaughtExceptionHandler,就会调用它。 我知道为一组线程()定义一个未捕获异常是可能的,我实际上正在使用它,但我想为那些没有定义自己的未捕获异常处理程序或没有与定义了默认异常处理程序的一组线程关联的线程定义一个全局未捕获异常 例如,我想达到这样的目标: 1° LEVEL ---> Call thread own UncaughtEx

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

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

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

这将实现您所寻找的目标

正如医生所说

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

还有一个有趣的注意事项(也在文档中)是关于您在ThreadGroup中使用处理程序的

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


您需要设置默认的未捕获异常处理程序。这是名为的线程类上的静态方法。执行此操作将为正在运行的应用程序设置异常处理程序。除非另有规定,否则它将是任何新线程的默认值

这对应用程序的所有线程都有效还是只对定义它的当前线程有效?是否应在应用程序的主方法中定义?它设置为Thread类中的静态字段,而不是Thread本地字段。因此,它对应用程序中的所有线程都有效。它可以在main方法中定义,但您可能希望在main类的
static
块中定义它。@JohnVint您能用上面的注释更新答案吗。对我来说,当你说它是Thread类中的一个静态字段时,很容易理解