在Java 1.6(和來自Eclipse)中發現在Executors.newCachedThreadPool()
中運行FutureTask
吞下Runnable.run()
方法中的異常後,我試圖想出一種方法來捕獲這些異常,而不添加throw/catch到我所有的Runnable
實現。如何在FutureTask中捕獲異常
的API建議重寫FutureTask.setException()
應有助於此:
原因這個未來與給定的throwable作爲其原因報告一個ExecutionException,除非未來已經設置或已被取消。這種方法在計算失敗時由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'很好用。我複製粘貼你的代碼,它的工作原理。 您可能還想在調用任務的get()方法時嘗試執行異常。 – Kru 2010-08-24 12:02:23
使用Callable/Future組合的錯誤方法。 future.get()方法爲您提供包裝在ExecutionException中的異常。 – Bhushan 2014-10-16 08:59:17