如何在FutureTask中捕获异常
发现在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);
        }
    }
}
以上是 如何在FutureTask中捕获异常 的全部内容, 来源链接: utcz.com/qa/423638.html

![如何在Go中将[]byte转换为io.Reader](/wp-content/uploads/thumbs/266064_thumbnail.jpg)




