当前位置: 首页 > 知识库问答 >
问题:

在开发过程中,如何在一个地方捕获来自不同线程的所有未捕获异常?

湛鸿
2023-03-14

我有一个具有GUI和套接字通信的不小的多线程应用程序。在开发过程中,我发现有时有些异常没有被捕获和记录。如果有,我必须盯着控制台看。

有没有办法在一个地方捕获来自不同线程(包括EDT)的未捕获异常,比如在main()中,并记录它们?我确实在main()中放置了一个try catch来捕捉可丢弃的对象,但它不起作用。

编辑:

更具体地说,我有遗嘱执行人。newCachedThreadPool(),具有Runnables。我不想在很多情况下使用Callable,因为我不想阻止我的调用线程。那么,我如何从这些可运行程序中捕捉异常呢?

还有,我如何从Swing EDT捕获未捕获的异常?

共有2个答案

桓深
2023-03-14

在大型复杂程序中,这不是一个简单的问题,因为无法在不同的线程中捕获异常,而不是抛出异常的线程。您必须确保程序中的每个线程都有一个处理程序,该处理程序将捕获所有异常并报告它们。

如果您控制创建所有线程的代码,这就足够容易了,但如果您调用代表您创建线程的库例程,这就更难了。如果幸运的话,这些库将允许您提供一个线程工厂,从而允许您的代码在创建新线程时获得控制权。

即使您可以确保每个线程都有一个未捕获的异常处理程序来做正确的事情,您仍然可能有一些代码隐藏在某个地方(可能在您调用的某个第三方库中),这些代码捕获异常并忽略它。

祝你好运!

柳志专
2023-03-14

我建议使用方法Thread为未捕获的异常设置UncaughtExceptionHandler类型的自定义处理程序。setDefaultUncaughtExceptionHandler。当线程由于未捕获的异常即将终止时,JVM将调用此处理程序。

    Thread.setDefaultUncaughtExceptionHandler((Thread t, Throwable e) -> {
            System.out.println(t + " throws exception: " + e);
    });

UPD:

至于Swing EDT案例,我认为这里有很好的答案。

 类似资料:
  • 我目前在我的路由中使用dotry/doCatch块,因此我无法使用全局onException块。 然而,如果驼峰路由中断(由于错误代码或意外/未测试的场景),我希望执行一些业务逻辑。希望这永远不会发生,但我仍然想处理更糟糕的情况。 我不能在全局OneException块中有java.lang.Exception,而且,我不想在每个路由上都添加一个额外的捕获。 在抛出未捕获的异常和中断路由之前,是否

  • 使用Java(android,但这是一个Java问题),我在应用程序类中创建了一个默认的异常处理程序,大致如下所示,它取自一些SO线程: 让我们谈谈我的目标是什么。我需要为crashLytics事故报告记录额外的信息。因此,每当发生异常时,就会调用钩子uncaughtException(线程线程,可抛出的ex)。我假设这将适用于崩溃和异常(不确定)。 关于这个问题的3个问题: 更新:我在这里看到有

  • 问题内容: 我们希望在应用程序日志中跟踪这些异常-默认情况下,Java只会将它们输出到控制台。 问题答案: 在EDT中和EDT外,未捕获的异常之间存在区别。 另一个问题有一个解决方案,但是如果您只想咀嚼EDT部分的话…

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

  • 问题内容: 我对Python和多线程编程非常陌生。基本上,我有一个脚本可以将文件复制到另一个位置。我希望将其放置在另一个线程中,以便可以输出以指示脚本仍在运行。 我遇到的问题是,如果无法复制文件,它将引发异常。如果在主线程中运行,这没关系;但是,使用以下代码不起作用: 在线程类本身中,我尝试重新抛出异常,但是它不起作用。我已经看到这里的人问类似的问题,但是他们似乎都在做比我想做的事情更具体的事情(

  • 我只是在练习java,目前我正在试验getter/setter方法和构造函数。java程序的工作原理是,我能够将用户输入存储到对象中,但当我将字符串“Dice and rollers”输入到gametype字符串变量中时,会出现一个挂起的未捕获异常InputMismatch错误。 有人能给我解释一下这是为什么吗? 另外,我在下面分享了我的源代码。 上面的是超类,下面的源代码是构造函数和getter