Werfen Ausnahme von CompletableFuture
Ich habe den folgenden code:
//How to throw the ServerException?
public void myFunc() throws ServerException{
//Some code
CompletableFuture<A> a = CompletableFuture.supplyAsync(() -> {
try {
return someObj.someFunc();
} catch(ServerException ex) {
//throw ex; gives an error here.
}
}));
//Some code
}
someFunc()
wirft einen ServerException
. Ich will nicht, dies zu behandeln, sondern hier, die Ausnahmen von someFunc()
Anrufer von myFunc()
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein code deutet darauf hin, dass Sie mit dem Ergebnis des asynchronen Vorgang zu einem späteren Zeitpunkt in der gleichen Methode, so müssen Sie befassen sich mit
CompletionException
sowieso, also eine Möglichkeit, damit umzugehen, istAlle Ausnahmen, die innerhalb der asynchronen Verarbeitung der
Supplier
erhalten-verpackt in einerCompletionException
beim Aufrufjoin
Ausnahme derServerException
wir haben bereits verpackt in einemCompletionException
.Wenn wir wieder werfen die Ursache des
CompletionException
können wir Gesicht ungeprüften Ausnahmen, d.h. Unterklassen vonError
oderRuntimeException
oder unsere benutzerdefinierte überprüft AusnahmeServerException
. Der code oben behandelt alle von Ihnen mit einem multi-catch, die re-werfen. Seit dem deklarierten RückgabetypgetCause()
istThrowable
der compiler erfordert, dass wir uns mit dieser Art, obwohl wir bereits behandelt alle möglichen Arten. Die straight-forward-Lösung ist, werfen diese eigentlich unmöglich throwable eingewickelt in einAssertionError
.Alternativ könnten wir verwenden eine alternative Folge Zukunft für unsere eigene exception:
Diese Lösung wird erneut werfen alle "unerwarteten" throwables in Ihrer form gewickelt, sondern nur werfen Sie die benutzerdefinierte
ServerException
in seiner ursprünglichen form weitergegeben über dieexception
Zukunft. Beachten Sie, dass wir haben, um sicherzustellen, dassa
abgeschlossen ist (wie der Aufrufjoin()
erste), bevor wir die Abfrage derexception
Zukunft, um Wettlaufsituationen zu vermeiden.Für diejenigen, die andere Wege auf die Ausnahmebehandlung mit completableFuture
Unten sind einige Möglichkeiten, wie zum Beispiel handling-Parsing-Fehler zu Integer:
1. Mit
handle
Methode - Sie ermöglicht Ihnen, eine Standard-Wert auf Ausnahme2. Mit
exceptionally
Methode - ähnlichhandle
aber weniger ausführlich,3. Mit
whenComplete
Methode - mit dieser hört die Methode auf seine Spuren, und nicht ausführen der nächstenthenAcceptAsync
4. Vermehrung der Ausnahme über
completeExceptionally
CompletableFuture<Void>
, der gerade wieder einenull
wo ein Objekt vom TypVoid
erwartet 🙂 mir Dauerte Stunden, um herauszufinden, diese einfache Sache.Ich denke, man sollte wickeln, dass in einem
RuntimeException
und werfen:Oder viele werden ein kleines Dienstprogramm, das helfen würde:
Und dann könnte man
unwrap
dass..ServerException
nur.go()
Methode würde nie werfen nichts. Ich denke, es fehlt einjoin()
nennen. AuchWrapper
nicht viel mehr als das, was bereits mitThrowable.getCause()
. Ich würde nicht wickeln, eine Ausnahme, in eine andere, ohne die Ursache, denn Sie bricht mit der Konvention, und es wird nicht gedruckt richtige stacktraces.go
war es nur um zu beweisen, es ist nicht sehr nützlich in der Tat.Wrapper
auf der anderen Seite ist hier nur wickeln Sie das geprüft-Ausnahme in eine runtime ein.go()
Ihretry
/catch
würde eigentlich nie fangen, dieWrapper
. Ich finde es ziemlich irreführend. FürWrapper
ich meinte, Sie sollten Sie anrufensuper(Throwable)
statt definieren Sie Ihren eigenen Bereich, so dassprintStackTrace()
undgetCause()
Verhalten würde, wie natürlich erwartet, dass aus einem solchen wrapper.Selbst wenn die andere Antwort ist sehr nett. aber ich gebe Ihnen einen anderen Weg zu werfen, eine checked exception in
CompletableFuture
.WENN Sie nicht wollen, rufen Sie eine
CompletableFuture
im anderen thread, die Sie verwenden können, eine anonyme Klasse zu handhaben es so:WENN, die Sie aufrufen möchten, ein
CompletableFuture
im anderen thread, Sie kann auch eine anonyme Klasse zu behandeln, aber die run-Methode vonrunAsync
: