Fonctionnel Java - l'Interaction entre les whenComplete et exceptionnellement
Dans ce code:
doSomethingThatMightThrowAnException()
.whenComplete((result, ex) -> doSomethingElse()})
.exceptionally(ex -> handleException(ex));
Quand il y a une exception de doSomethingThatMightThrowAnException
, sont à la fois doSomethingElse
et handleException
exécuter, ou est l'exception consommée par le whenComplete
ou la exceptionally
?
EDIT:
doSomethingThatMightThrowAnException
renvoie une CompletableFuture
, qui pourrait completeExceptionally
. C'est l'exception dont je parle.
OriginalL'auteur peco | 2015-07-10
Vous devez vous connecter pour publier un commentaire.
La la documentation de
whenComplete
dit:(l'emphase est mienne)
Cela implique qu'une exception n'est pas avalé par cette scène, comme il est censé avoir le même résultat ou d'exception. Cependant, vous pourriez être surpris par le fait que les étapes ultérieures recevrez l'exception d'une étape précédente, enveloppé dans un
CompletionException
, tel que discuté ici, il n'est donc pas exactement la même exception:sera d'impression:
Notez que vous pouvez toujours ajouter des actions multiples sur une même scène au lieu d'enchaîner ensuite:
Bien sûr, puisque maintenant il n'y a pas de dépendance entre la scène
2a
et2b
, il n'existe aucune commande entre eux et dans le cas de l'action asynchrone, ils peuvent s'exécuter simultanément.OriginalL'auteur Holger
La exceptionnellement méthode unis:
Ce n'est pas, à mon humble avis écrit dans les plus claires de l'anglais, mais je dirais que cela signifie que si une exception est levée, le seul du
exceptionally
action sera déclenchée. Si aucune exception n'est levée, le seul dunormal
action sera exécutée.OriginalL'auteur OldCurmudgeon
doSomethingThatMightThrowAnException()
est enchaîné avec.whenComplete((result, ex) -> doSomethingElse()})
et.exceptionally(ex -> handleException(ex));
mais si elle lève une exception, il s'arrête là car aucun objet ne sera transmis dans la chaîne.Rappelez-vous que une exception jeter à l'appelant, de sorte que si
doSomethingThatMightThrowAnException()
intercepte l'exception en interne, il la jette. Si c'est votre classe, vous devez savoir si il n'jeter, si ce n'est de vérifier les docs pour les bibliothèques que vous utilisez.OriginalL'auteur Tuxxy_Thang