Como capturar exceções no FutureTask
Depois de descobrir queFutureTask
correndo em umExecutors.newCachedThreadPool()
no Java 1.6 (e do Eclipse) engole exceções no diretórioRunnable.run()
método, tentei encontrar uma maneira de capturá-los sem adicionar throw / catch a todos os meusRunnable
implementações.
A API sugere que a substituiçãoFutureTask.setException()
deve ajudar nisso:
Faz com que este futuro relate uma ExecutionException com o lançamento possível como sua causa, a menos que este futuro já tenha sido definido ou cancelado. Este método é chamado internamente pelo método run, após falha do cálculo.
No entanto, esse método não parece ser chamado (a execução com o depurador mostra que a exceção é capturada peloFutureTask
, massetException
não é chamado). Eu escrevi o seguinte programa para reproduzir o meu problema:
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);
}
}
Minha principal pergunta é: Como capturar exceções lançadas em uma FutureTask? Por que nãosetException
ser chamado?
Também gostaria de saber por que oThread.UncaughtExceptionHandler
mecanismo não é usado porFutureTask
, Existe alguma razão para isso?