【问题标题】:Defining one global UncaughtExceptionHandler for all threads of my application为我的应用程序的所有线程定义一个全局 UncaughtExceptionHandler
【发布时间】:2012-01-11 20:06:07
【问题描述】:

我想在我的 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() 方法中处理 unhandledthread exception 事件处理程序:

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

即使在 Java 中也可以完成?

如何在 Java 中覆盖默认的 UncaughtExceptionHandler ?

【问题讨论】:

    标签: java exception exception-handling uncaught-exception


    【解决方案1】:

    Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler ex)

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

    正如医生所说

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

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

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

    【讨论】:

    • 这对应用程序的所有线程都有效还是仅对定义它的当前线程有效?应该在应用的main方法中定义?
    • 在 Thread 类中设置为静态字段,而不是线程本地字段。所以它对应用程序中的所有线程都有效。它可以在 main 方法中定义,但您可能希望在 main 类的 static 块中定义它。
    • @JohnVint 您能否用上述评论更新答案。对我来说,当你说它是 Thread 类中的静态字段时很容易理解
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-29
      • 2019-12-03
      • 2011-01-07
      • 2013-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      相关资源
      最近更新 更多