Après avoir constaté que FutureTask
s'exécutant dans un Executors.newCachedThreadPool()
sur Java 1.6 (et depuis Eclipse) avale des exceptions dans la méthode Runnable.run()
, j'ai essayé de trouver un moyen de les attraper sans ajouter de jet/catch à toutes mes implémentations Runnable
.Comment attraper des exceptions dans FutureTask
L'API suggère que l'annulation de FutureTask.setException()
devrait contribuer à ceci:
Causes ce futur signaler un ExecutionException avec le throwable donné que sa cause, à moins que cet avenir a déjà été mis ou a été annulée. Cette méthode est invoquée en interne par la méthode run en cas d'échec du calcul.
Cependant, cette méthode ne semble pas être appelé (en cours d'exécution avec le débogueur montre l'exception est interceptée par FutureTask
, mais setException
n'est pas appelé). J'ai écrit le programme suivant pour reproduire mon problème:
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);
}
}
Ma principale question est: Comment puis-je attraper des exceptions jetées dans un FutureTask? Pourquoi ne pas setException
appelé?
Aussi, je voudrais savoir pourquoi le mécanisme Thread.UncaughtExceptionHandler
n'est pas utilisé par FutureTask
, est-ce qu'il ya une raison pour cela?
'setException' est bien utilisé. J'ai copié-collé votre code et cela fonctionne. Vous pouvez également essayer try-catch de 'ExecutionException' lorsque vous appelez la méthode' get() 'sur la tâche. – Kru
Mauvaise façon d'utiliser le combo Callable/Future. La méthode future.get() vous fournit l'exception enveloppée dans une ExecutionException. – Bhushan