Funktionale Java - Interaktion zwischen whenComplete und außergewöhnlich
In diesem code:
doSomethingThatMightThrowAnException()
.whenComplete((result, ex) -> doSomethingElse()})
.exceptionally(ex -> handleException(ex));
Wenn es eine Ausnahme von doSomethingThatMightThrowAnException
sind beide doSomethingElse
und handleException
laufen, oder ist die Ausnahme, verbraucht entweder die whenComplete
oder die exceptionally
?
EDIT:
doSomethingThatMightThrowAnException
gibt eine CompletableFuture
, die möglicherweise completeExceptionally
. Dies ist die Ausnahme von der ich spreche.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Dokumentation von
whenComplete
sagt:(Hervorhebung von mir)
Dies bedeutet, dass eine Ausnahme nicht geschluckt, durch diese Phase, wie es gedacht ist zu dem gleichen Ergebnis oder Ausnahme. Jedoch, Sie werden überrascht sein von der Tatsache, dass in den nachfolgenden Stufen erhalten die Ausnahme von einer vorherigen Stufe eingewickelt in eine
CompletionException
wie besprochen hier, so ist es nicht genau das gleiche, Ausnahme:drucken:
Beachten Sie, dass Sie immer anfügen mehrere Aktionen auf einer Bühne statt, die die Verkettung dann:
Natürlich, denn jetzt gibt es keine Abhängigkeit zwischen der Bühne
2a
und2b
es ist keine Bestellung zwischen Ihnen und im Fall von asynchronen Aktion, die Sie gleichzeitig ausgeführt werden können.Den außergewöhnlich Methode besagt:
Ist das nicht, IMHO geschrieben am klarsten Englisch, aber ich würde sagen, dass bedeutet, dass wenn eine exception geworfen wird, dann nur die
exceptionally
Aktion ausgelöst werden. Wenn keine exception geworfen wird, dann nur dienormal
Aktion ausgeführt wird.doSomethingThatMightThrowAnException()
verkettet ist mit.whenComplete((result, ex) -> doSomethingElse()})
und.exceptionally(ex -> handleException(ex));
aber wenn es eine Ausnahme wirft, es endet genau dort wird kein Objekt übergeben werden, auf die in der Kette.Denken Sie daran, dass Sie eine Ausnahme werfen wird dem Aufrufer, also, wenn
doSomethingThatMightThrowAnException()
fängt die Ausnahme intern wird es hinauswerfen. Wenn dies Ihre Klasse, die Sie wissen sollten, wenn es nicht zu werfen, falls nicht, überprüfen Sie Dokumente für Bibliotheken, die Sie verwenden.