gpt4 book ai didi

java - 抑制异常作为收集多个异常的方式

转载 作者:行者123 更新时间:2023-12-05 06:37:31 24 4
gpt4 key购买 nike

我有一个循环模式,在该模式中,我并行运行多个任务,要么它们全部成功,要么整个过程因为其中一个而失败。虽然我可以确定进程在第一个任务异常之后就失败了,但我必须等待它们全部结束才能报告异常。

{
List<Future<?>> futures = launchTasks();
boolean anyProcessFailed = false;

for (Future<?> future: futures)
try {
future.get();
} catch(ExecutionException ex) {
//This process failed
anyProcessFailed=true;
}

if (anyProcessFailed) throw new Exception();
}

上面的代码有效,但是最后抛出的异常没有引用导致它的异常,可能是一个或所有。

问题是:使用Throwable.addSuppressed 来实现异常的多个原因 的概念是不是一个好的做法,或者我应该实现我自己的 Exception 类型,公开一个 Throwable[] getCauses()?

我已经读到,被抑制的异常虽然有一个公共(public) API,但只能由 JRE 在 try-with-resources 语句期间设置。事实上,try-with-resources 是普通老式 try-finally block 的语法糖

示例 1:下面的代码不会等待其他任务完成,因此其他线程将被置之不理。

{
List<Future<?>> futures = launchTasks();

for (Future<?> future: futures)
try {
future.get();
} catch(ExecutionException ex) {
//This process failed
throw new Exception(ex);
}

}

例子2:我现在在做什么

{
List<Future<?>> futures = launchTasks();
Exception ex = new Exception();

for (Future<?> future: futures)
try {
future.get();
} catch(ExecutionException e) {
//This process failed
ex.addSuppressed(e);
}

if (ex.getSuppressed().length > 0) throw ex;
}

最佳答案

通常,在您的代码中实现您自己的代表真正异常场景的异常始终是一个好习惯,如果它可以为您的 API 调用者提供有意义的数据。否则,使用 JDK 中的通用异常之一将是更好的选择。我认为在 addSuppressed 方法的 JavaDoc 中,提到了 try-finally 场景作为 JDK 中此方法的示例用法。如果有意义,您当然可以将其用于您的场景。

关于java - 抑制异常作为收集多个异常的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47772767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com