java - 如何将异常集合作为根本原因传递?
问题描述
某些方法myMethod
调用多个并行执行并等待它们的终止。
这些并行执行可以以异常结束。所以myMethod
得到一个例外列表。
我想将异常列表作为根本原因传递,但根本原因可能只是一个异常。当然,我可以创建自己的异常来实现我想要的,但我想知道 Java、Spring 或 Spring Batch 是否有这样的开箱即用的东西。
解决方案
我不确定我是否会这样做(尽管考虑到 JavaDoc,我无法告诉你我为什么犹豫),但在 上有抑制异常的列表Throwable
,你可以将其添加到 via addSuppressed
。JavaDoc 似乎并没有说这仅适用于 JVM 在 try-with-resources 中使用:
将指定的异常附加到为传递此异常而被抑制的异常。此方法是线程安全的,通常由 try-with-resources 语句调用(自动和隐式)。
除非通过构造函数禁用,否则会启用抑制行为。当抑制被禁用时,这个方法除了验证它的参数之外什么都不做。
请注意,当一个异常导致另一个异常时,通常会捕获第一个异常,然后抛出第二个异常作为响应。换句话说,这两个例外之间存在因果关系。相反,在某些情况下,可以在同级代码块中引发两个独立的异常,特别是在 try-with-resources 语句的 try 块和关闭资源的编译器生成的 finally 块中。在这些情况下,只能传播引发的异常之一。在 try-with-resources 语句中,当有两个这样的异常时,将传播源自 try 块的异常,并将 finally 块的异常添加到由 try 块的异常抑制的异常列表中。作为一个异常展开堆栈,
一个异常可能已经抑制了异常,同时也由另一个异常引起。异常是否有原因在其创建时在语义上是已知的,这与异常是否会抑制其他异常不同,这通常仅在抛出异常后才确定。
请注意,程序员编写的代码也能够在存在多个同级异常且只能传播一个异常的情况下调用此方法。
请注意最后一段,这似乎适合您的情况。
推荐阅读
- mysql - 如何在 MySql 中解决这个 GROUP BY 问题?
- java - JPA Criteria API 获取具有特定父属性值的实体
- c++ - 向 googletest 添加依赖项?
- html - CSS:色块的奇怪边缘
- android - @firebase/firestore:Firestore (7.6.0):无法访问 Cloud Firestore 后端。后端在 10 秒内没有响应
- elasticsearch - 没有post body的Elasticsearch请求查询(不允许添加body)
- c# - .Net Core 多项目 docker build
- haskell - 为什么 Data.Time.Clock.POSIX 中的 getCurrentTime 函数不能按预期工作?
- android - unity是否加载存储在 android 设备内部存储中的 3d 模型?
- jquery - Laravel 错误:未定义的变量 - rating_points