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

标签 java exception-handling

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

{
    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/

相关文章:

java - 动态编译.java文件为.class

java - 我们应该避免在不必要的时候使用 spring managed bean 吗?

java httpservlet getparameter 从 html 返回 null

perl - 在 Catalyst 中使用 Plack::Middleware 兼容异常时缺少日志输出

c# - 在 C# 中处理 NullReferenceExceptions 的更好方法

java - 客户端无法从另一个IP连接

Java Scanner 分隔符不会分割最后一部分

java - Try/Catch 未捕获异常

c - 在 C 中停止定时器的信号处理程序

c# - .NET 1.1 中未处理的异常处理程序