当前位置: 首页 > 面试题库 >

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

贺俊楚
2023-03-14
问题内容

我想在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对象,因为这可能导致无限递归。



 类似资料:
  • 问题内容: 我问一个有关如何覆盖默认的Java异常处理问题,被告知的答案在这里。 现在的问题是:是否有一种方法可以将该处理程序泛化为所有线程,而无需在每个线程中明确声明? 我认为应该可以某种方式获取所有线程,然后将其绑定到异常处理程序? 问题答案: 使用。正如javadoc所说: “通过设置默认的未捕获异常处理程序,应用程序可以更改那些已经接受系统提供的任何“默认”行为的线程的未捕获异常处理方式(

  • 问题内容: 我最近继承了一个小型Java程序,该程序从大型数据库中获取信息,进行一些处理并生成有关该信息的详细图像。原始作者使用单个线程编写了代码,然后对其进行了修改,以使其可以使用多个线程。 他在代码中定义了一个常量; 然后,它设置用于创建映像的线程数。 我理解他的理由,即线程数不能大于可用处理器的数目,因此将其设置为可以充分发挥处理器潜力的数量。这样对吗?还是有更好的方法来充分利用处理器的潜力

  • 我还尝试通过注册这个筛选器来全局设置属性: 但这也不会记录所有错误。 如何截获像上面通过调用生成的错误,以便记录它们?看来这个答案应该是显而易见的,但我已经尝试了迄今为止我能想到的一切。 或者,您可以跳过注册,只使用属性装饰单个控制器。

  • 我有一个java应用程序,它在运行时会产生另一个JVM。然而,我想使用jpack打包我的应用程序,它运行得很好。但是在运行时,当我的应用程序尝试使用调用下一个JVM时 我必须知道,应用程序是使用定制的JVM启动的,并且没有像“java”这样的命令。所以我得到的错误是这个java。无法执行getAbsolutePath()。 如果没有java可执行文件,我的应用程序如何在单独的进程中运行另一个jar

  • 我想更改整个应用程序组件(文本视图、编辑文本、按钮等)的字体。我发现我可以为应用程序设置样式,但在这里我无法将字体从资产文件夹放入自定义样式xml。我必须将我的自定义TTF字体从资产文件夹放到样式xml中的typeface元素中。我无法将单空间字体更改为自定义字体。我的风格是

  • 问题内容: 编辑:我现在确定问题与保存所有其他命令的循环有关, 因为我已将其注释掉,并且在部署应用程序时没有附加的异常。我不确定它有多重要,但是我的实现看起来像这样: 因此,现在该线程在部署应用程序时运行,但是由于注释了循环,因此它没有实际意义。 当我的应用程序加载时,我需要在后台运行一个线程,并不断(无超时)检查某个对象队列。当然,一旦有了对象,它就会“照顾它们”,然后继续检查队列。 目前,我正