Funktionales Java - Interaktion zwischen whenComplete und ausnahmsweise

8

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 ?

verbraucht?

BEARBEITEN:

doSomethingThatMightThrowAnException gibt eine CompletableFuture zurück, die möglicherweise completeExceptionally ist. Dies ist die Ausnahme, über die ich spreche.

    
peco 10.07.2015, 10:29
quelle

3 Antworten

10

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:

%Vor%

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.

    
Holger 10.07.2015, 12:07
quelle
1

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.

    
OldCurmudgeon 10.07.2015 10:41
quelle
0

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.

    
Tuxxy_Thang 10.07.2015 10:35
quelle