In diesem Code:
%Vor% Wenn es eine Ausnahme von doSomethingThatMightThrowAnException
gibt, werden beide doSomethingElse
und handleException
ausgeführt, oder wird die Ausnahme von whenComplete
oder exceptionally
?
BEARBEITEN:
doSomethingThatMightThrowAnException
gibt eine CompletableFuture
zurück, die möglicherweise completeExceptionally
ist. Dies ist die Ausnahme, über die ich spreche.
Die Dokumentation von whenComplete
sagt:
Gibt eine neue CompletionStage mit demselben Ergebnis oder derselben Exception wie diese Stufe zurück , die die angegebene Aktion ausführt, wenn diese Phase abgeschlossen ist.
(Betonung meiner)
Dies bedeutet, dass eine Ausnahme von dieser Stufe nicht verschluckt wird, da sie das gleiche Ergebnis oder die gleiche Ausnahme haben soll. Sie werden jedoch möglicherweise überrascht sein, dass nachfolgende Stufen die Ausnahme einer vorherigen Phase erhalten, die in einem CompletionException
eingewickelt ist, wie in hier , es ist also nicht genau die selbe Ausnahme:
wird gedruckt:
%Vor%Beachten Sie, dass Sie immer mehrere Aktionen auf einer Stufe anhängen können, anstatt sie zu verketten:
%Vor% %Vor% Da zwischen den Phasen 2a
und 2b
keine Abhängigkeiten mehr bestehen, gibt es zwischen ihnen keine Reihenfolge und im Fall von async-Aktionen können sie gleichzeitig ausgeführt werden.
Die Ausnahme Methode besagt:
Gibt eine neue CompleableFuture zurück, die abgeschlossen wird, wenn diese CompleableFuture abgeschlossen ist, wobei das Ergebnis der angegebenen Funktion der Exception die Beendigung dieser CompletableFuture auslöst, wenn sie in Ausnahmefällen abgeschlossen wird; Wenn diese CompleableFuture normal abgeschlossen wird, wird die zurückgegebene CompletableFuture andernfalls normalerweise mit demselben Wert abgeschlossen. Hinweis: Flexiblere Versionen dieser Funktionalität sind mit den Methoden complete und handle verfügbar.
Dies ist nicht, IMHO geschrieben in der klarsten Englisch, aber ich würde sagen, dass bedeutet, dass, wenn eine Ausnahme ausgelöst wird, nur die Aktion exceptionally
ausgelöst wird. Wenn keine Ausnahme ausgelöst wird, wird nur die Aktion normal
ausgeführt.
doSomethingThatMightThrowAnException () ist verkettet mit .whenComplete ((result, ex) - & gt; doSomethingElse ()}) und .exceptionally (ex- & gt; handleException (ex)); aber wenn es eine Ausnahme auslöst, endet es genau dort, da kein Objekt in der Kette weitergegeben wird.
Denken Sie daran, dass eine Exception an den Aufrufer gesendet wird. Wenn doSomethingThatMightThrowAnException () die Ausnahme intern abfängt, wird sie verworfen. Wenn dies Ihre Klasse ist, sollten Sie wissen, ob sie es tut, wenn nicht, überprüfen Sie die Dokumente auf lilbraris, die Sie verwenden.
Tags und Links java java-8 functional-programming