Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在开发过程中,如何在一个地方捕获来自不同线程的所有未捕获异常?_Java_Multithreading_Swing - Fatal编程技术网

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

Java 在开发过程中,如何在一个地方捕获来自不同线程的所有未捕获异常?,java,multithreading,swing,Java,Multithreading,Swing,我有一个带有GUI和套接字通信的不小的多线程应用程序。在开发过程中,我发现有时会有一些异常未被捕获和记录。如果有,我必须盯着控制台看 有没有一种方法可以在一个地方捕获来自不同线程(包括EDT)的未捕获异常,比如main(),并记录它们?我确实在main()中放置了一个try catch来捕捉可丢弃的但它不起作用 编辑: 更具体地说,我有Executors.newCachedThreadPool()和Runnables。我不想在很多情况下使用可调用的,因为我不想阻止我的调用线程。那么我如何从那些可

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

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

编辑:

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


以及如何从Swing EDT捕获uncaught异常?

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

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


至于Swing EDT的情况,我认为有一个很好的答案。

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

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

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


祝你好运

使用Thread.UncaughtExceptionHandler,如uhm中的。。。为什么您认为
Callable
会阻止“调用线程”?这甚至没有任何意义,就像说香蕉的味道导致了全球变暖
Callable
是一个
功能接口
,可以应用于许多方法签名-这与阻塞操作无关。。。。一点也不<代码>可调用仅当调用方不使用线程时才会阻塞-将可调用转换为可运行不会改变这一点。我得到了一些线程的解决方案。但我也有一个线程池和Swing EDT。如何处理?请看我的编辑。。。。完全不真实。我建议不要写一些与你无关的话题的答案。异常会传播/冒泡,事实上捕获所有内容非常容易,请参见问题下的第一条注释。@Specializet当异常“冒泡”到不是您的代码时,捕获异常并不那么容易,当异常在非您的代码中被捕获和忽略时,捕获异常就不那么容易了。这是一个完全不同的故事,与正常的、未捕获的异常无关。