Les exceptions et leurs causes ne sont toujours qu'une chose 1: 1: vous pouvez lever une exception et chaque exception ne peut avoir qu'une seule cause (qui peut à nouveau avoir une cause ...).
Cela pourrait être considéré comme une erreur de conception, en particulier lorsque vous envisagez un comportement multithread comme vous l'avez décrit.
C'est l'une des raisons pour lesquelles Java 7 a ajouté addSuppressed
à throwable qui peut essentiellement attacher une quantité arbitraire d'exceptions à une autre seule (l'autre motivation principale était d'essayer avec des ressources qui avait besoin d'un moyen de gérer les exceptions dans le bloc enfin sans abandonner silencieusement leur).
Donc, fondamentalement, lorsque vous avez 1 exception qui entraîne l'échec de votre processus, vous ajoutez celle-ci comme cause de votre exception de niveau supérieur, et si vous en avez plus, vous les ajoutez à celle d'origine en utilisant addSuppressed
. L'idée est que cette première exception a "supprimé" les autres devenant membre de la "chaîne d'exceptions réelle".
Exemple de code:
Exception exception = null;
for (Foobar foobar : foobars) {
try {
foobar.frobnicate();
} catch (Exception ex) {
if (exception == null) {
exception = ex;
} else {
exception.addSuppressed(ex);
}
}
}
if (exception != null) {
throw new SomethingWentWrongException(exception);
}
AggregateException
qui contient une liste d'exceptions. Cette idée devrait également s'appliquer à Java.