2017-07-12 2 views
1

Normalerweise, wenn eine Future läuft und auf das Ergebnis wartet, kann ich nur InterruptedException | ExecutionException fangen.Wie können benutzerdefinierte Ausnahmen von Futures abgefangen werden?

Aber was ist, wenn die Aufgabe eine CustomException wirft, die ich explizit fangen möchte? Könnte ich besser als e.getCause() instanceof CustomException überprüfen?

List<Future> futures; //run some task 

for (Future future : futures) { 
    try { 
     future.get(); //may throw CustomException 
    } catch (InterruptedException | ExecutionException e) { 
     if (e.getCause() instanceof CustomException) { 
      //how to catch directly? 
     } 
    } 
} 

Antwort

3

CustomException Unter der Annahme geprüft wird, ist es nicht möglich ist, weil die Sprache nicht zulässt, dass ein catch für eine solche Ausnahme hinzuzufügen, die nicht Teil der Future#get() Signatur ist, und kann daher nie mit dieser Methode geworfen werden (Dies ist Teil seines Vertrags). In Ihrem Code ist der Kommentar may throw CustomException da Sie wussten die Implementierung der spezifischen Aufgabe Future. Soweit die get Methode der Future Schnittstelle betroffen ist, wird jede solche implementierungsspezifische Ausnahme als Ursache für eine ExecutionException umgebrochen.

Weiterhin mit e.getCause()ist der richtige Weg, solch eine benutzerdefinierte Ausnahme, wie ausdrücklich in der Dokumentation von ExecutionException der Inspektion erwähnt:

Exception ausgelöst, wenn das Ergebnis einer Aufgabe abzurufen versucht, die durch das Werfen abgebrochen eine Ausnahme. Diese Ausnahme kann mit der Methode getCause() überprüft werden.

-1

Sie könnten so viele Ausnahme fangen, wie Sie wollen, aber es sollte in einer bestimmten Reihenfolge sein, wo mehr breitere Ausnahme nach dem Unter eingestuft Ausnahme gehen müssen.

Zum Beispiel:

catch (CustomException e) { 

} catch (InterruptedException | ExecutionException e) { 

} 

// It could be even there if CustomException is not extended from InterruptedException | ExecutionException 
+0

Nein, 'future.get()' kann nur die zwei Ausnahmen explizit werfen. Nicht mehr. – membersound

Verwandte Themen