Algum método myMethod
,, chama várias execuções paralelas e aguarda suas terminações.
Essas execuções paralelas podem terminar com exceções. Então, myMethod
obtém uma lista de exceções.
Desejo passar a lista de exceções como causa raiz, mas a causa raiz pode ser apenas uma única exceção. Claro que posso criar minha própria exceção para alcançar o que quero, mas quero saber se Java, Spring ou Spring Batch tem algo assim fora da caixa.
AggregateException
que contém uma lista de exceções. Essa ideia também deve ser aplicada ao Java.Respostas:
Não tenho certeza se o faria (embora, devido ao JavaDoc, eu não possa lhe dizer por que hesito), mas há a lista de exceções suprimidas
Throwable
, às quais você pode adicionar viaaddSuppressed
. O JavaDoc não parece dizer que isso é apenas para a JVM usar em try-with-resources:Observe o último parágrafo, que parece se adequar ao seu caso.
fonte
Exceções e suas causas são sempre apenas uma coisa 1: 1: você pode lançar uma exceção e cada exceção pode ter apenas uma causa (que pode novamente ter uma causa ...).
Isso pode ser considerado uma falha de design, especialmente ao considerar o comportamento multithread como você descreveu.
Essa é uma das razões pelas quais o Java 7 foi adicionado
addSuppressed
ao throwable, que basicamente pode anexar uma quantidade arbitrária de exceções a uma única (a outra motivação principal foi a tentativa com recursos, que precisava de uma maneira de lidar com exceções no bloco final sem cair silenciosamente eles).Então, basicamente, quando você tem uma exceção que causa falha no processo, você a adiciona como a causa da exceção de nível superior e, se tiver mais alguma, adiciona-as ao original usando
addSuppressed
. A idéia é que essa primeira exceção "suprima" os outros se tornem membros da "verdadeira cadeia de exceções".Código de amostra:
fonte