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

如何在FutureTask中捕获异常

荣声
2023-03-14
问题内容

发现在Java
1.6(以及从Eclipse)上FutureTask运行时,Executors.newCachedThreadPool()吞没了该Runnable.run()方法中的异常之后,我试图找到一种捕获这些异常的方法,而不会在我的所有Runnable实现中都添加throw
/ catch 。

该API建议覆盖FutureTask.setException()应对此有所帮助:

导致此future报告一个ExecutionException,并以给定throwable作为其原因,除非已经设置或取消了此Future。计算失败时,run方法在内部调用此方法。

但是,似乎未调用此方法(与调试器一起运行时,显示该异常已被捕获FutureTask,但未setException调用)。我编写了以下程序来重现我的问题:

public class RunTest {
    public static void main(String[] args) {
        MyFutureTask t = new MyFutureTask(new Runnable() {

            @Override
            public void run() {
                throw new RuntimeException("Unchecked exception");

            }
        });

        ExecutorService service = Executors.newCachedThreadPool();
        service.submit(t);
    }
}

public class MyFutureTask extends FutureTask<Object> {

    public MyFutureTask(Runnable r) {
        super(r, null);
    }

    @Override
    protected void setException(Throwable t) {
        super.setException(t);
        System.out.println("Exception: " + t);
    }
}

我的主要问题是:如何捕获FutureTask中引发的异常?为什么不setException打电话?

我也想知道为什么Thread.UncaughtExceptionHandler不使用该机制FutureTask,这有什么原因吗?


问题答案:

setException可能不是为了覆盖,而是提供了它以使您可以在需要时将结果设置为异常。您想要做的是重写done()方法并尝试获取结果:

public class MyFutureTask extends FutureTask<Object> {

    public MyFutureTask(Runnable r) {
        super(r, null);
    }

    @Override
    protected void done() {
        try {
            if (!isCancelled()) get();
        } catch (ExecutionException e) {
            // Exception occurred, deal with it
            System.out.println("Exception: " + e.getCause());
        } catch (InterruptedException e) {
            // Shouldn't happen, we're invoked when computation is finished
            throw new AssertionError(e);
        }
    }
}


 类似资料:
  • 问题内容: 我有一个Swing应用程序,即使我在/中都包含了所有内容,也没有捕获到异常。 我得到的只是这个堆栈跟踪: 问题答案: 正如另一位发布者所提到的,您的问题是该异常正在另一个线程(事件调度线程)中引发。几个解决方案: 在发生异常的实际代码周围进行尝试/捕获:例如,如果它是对ActionListener处理的按钮单击的响应,则将try / catch放入actionPerformed()方法

  • 问题内容: 我的JSP页面中有一个复选框,它接受整数值: 如果用户将输入的值更改为一个值,例如: 该页面将引发一个。如何在控制器中捕获并显示有意义的消息? 问题答案: 您可以使用JSTL的 c:catch 标签:

  • 本文向大家介绍如何在Clojurescript中捕获任何JavaScript异常?,包括了如何在Clojurescript中捕获任何JavaScript异常?的使用技巧和注意事项,需要的朋友参考一下 要在Clojurescript中捕获JavaScript异常,请尝试以下代码片段-

  • 本文向大家介绍如何捕获 setTimeout 异常相关面试题,主要包含被问及如何捕获 setTimeout 异常时的应答技巧和注意事项,需要的朋友参考一下 No description provided.

  • 我有一个骡子流,可以抛出异常(无法连接到连接器,组件抛出异常等)。当这种情况发生时,骡子流在异常发生的地方停止。我需要捕获流抛出的任何异常并发送电子邮件通知,指示发生了异常。(尤其是对于像从JMS读取一样异步运行的流)。我应该使用流中的什么元素来捕获任何异常并发送电子邮件? 我试过了: 但这根本就没有开始。我还尝试过: 但这似乎只在流抛出异常时才有效(正常的流功能被改变)。 @David Doss

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