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