如何在 FutureTask 中捕获异常
在发现在Java 1.6(以及从Eclipse)上运行会吞噬方法中的异常之后,我试图想出一种方法来捕获这些异常,而无需在我的所有实现中添加 throw/catch。FutureTask
Executors.newCachedThreadPool()
Runnable.run()
Runnable
API 建议重写应该有助于实现以下方面:FutureTask.setException()
导致此未来报告以给定可抛出的实例作为其原因的执行异常,除非此未来已被设置或已被取消。此方法在计算失败时由 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