首页 > 解决方案 > 如何将异常集合作为根本原因传递?

问题描述

某些方法myMethod调用多个并行执行并等待它们的终止。

这些并行执行可以以异常结束。所以myMethod得到一个例外列表。

我想将异常列表作为根本原因传递,但根本原因可能只是一个异常。当然,我可以创建自己的异常来实现我想要的,但我想知道 Java、Spring 或 Spring Batch 是否有这样的开箱即用的东西。

标签: javaexception

解决方案


我不确定我是否会这样做(尽管考虑到 JavaDoc,我无法告诉你我为什么犹豫),但在 上有抑制异常的列表Throwable,你可以将其添加到 via addSuppressed。JavaDoc 似乎并没有说这仅适用于 JVM 在 try-with-resources 中使用:

将指定的异常附加到为传递此异常而被抑制的异常。此方法是线程安全的,通常由 try-with-resources 语句调用(自动和隐式)。

除非通过构造函数禁用,否则会启用抑制行为。当抑制被禁用时,这个方法除了验证它的参数之外什么都不做。

请注意,当一个异常导致另一个异常时,通常会捕获第一个异常,然后抛出第二个异常作为响应。换句话说,这两个例外之间存在因果关系。相反,在某些情况下,可以在同级代码块中引发两个独立的异常,特别是在 try-with-resources 语句的 try 块和关闭资源的编译器生成的 finally 块中。在这些情况下,只能传播引发的异常之一。在 try-with-resources 语句中,当有两个这样的异常时,将传播源自 try 块的异常,并将 finally 块的异常添加到由 try 块的异常抑制的异常列表中。作为一个异常展开堆栈,

一个异常可能已经抑制了异常,同时也由另一个异常引起。异常是否有原因在其创建时在语义上是已知的,这与异常是否会抑制其他异常不同,这通常仅在抛出异常后才确定。

请注意,程序员编写的代码也能够在存在多个同级异常且只能传播一个异常的情况下调用此方法。

请注意最后一段,这似乎适合您的情况。


推荐阅读