如何在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

回到顶部