Las excepciones y sus causas son siempre solo una cosa 1: 1: puede lanzar una excepción y cada excepción solo puede tener una causa (que puede tener una causa ...).
Eso podría considerarse una falla de diseño, especialmente cuando se considera un comportamiento de subprocesos múltiples como lo describió.
Esa es una de las razones por las que Java 7 agregó addSuppressed
a tirar, que básicamente puede adjuntar una cantidad arbitraria de excepciones a una sola (la otra motivación principal fue probar con recursos que necesitaban una forma de manejar las excepciones en el bloque finalmente sin caer silenciosamente ellos).
Entonces, básicamente, cuando tiene 1 excepción que hace que su proceso falle, agrega esa como la causa de su excepción de nivel superior, y si tiene más, entonces las agrega a la original usando addSuppressed
. La idea es que esa primera excepción "suprimió" a los demás y se convirtieron en miembros de la "cadena de excepción real".
Código de muestra:
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
que contiene una lista de excepciones. Esa idea también debería ser aplicable a Java.