【问题标题】:Why does vavr's Try container catches Throwable but not Exception?为什么 vavr 的 Try 容器会捕获 Throwable 而不是 Exception?
【发布时间】:2020-03-27 12:21:30
【问题描述】:

我不是 java 类型系统和异常处理方面的专家。 但是我在 SO 中发现我们应该只捕获异常而不是 throwable。

这里是链接: Difference between using Throwable and Exception in a try catch

在 Vavr 的库中,我找到了以下源代码:

public interface Try<T> extends Value<T>, Serializable {
    long serialVersionUID = 1L;

    static <T> Try<T> of(CheckedFunction0<? extends T> supplier) {
        Objects.requireNonNull(supplier, "supplier is null");

        try {
            return new Try.Success(supplier.apply());
        } catch (Throwable var2) {
            return new Try.Failure(var2);
        }
    }
}

如果我使用这个容器,我以后会有什么问题吗?我会错过一些在执行“of”函数期间可能发生的严重异常吗?

【问题讨论】:

    标签: java exception vavr


    【解决方案1】:

    ThrowableException 的超类,这意味着catch (Throwable var) 也可以捕获异常。因此,vavr 中的代码是正确的——只要有任何Throwable 被抛出,它就会被包裹在Try.Failure 中。

    【讨论】:

      【解决方案2】:

      注意链接帖子中answer 的内容:

      您通常不应该这样做,除非在您要记录的线程的最高“捕获所有”级别或否则绝对处理所有可能出错的事情

      强调我的。

      这可能是这里的意图。这是一个try 包装器,旨在处理一切,并让用户决定他们想要处理什么以及如何处理。似乎他们正在使用像 Scala 的 Try 这样的构造来让您处理异常而无需手动捕获它们。为了使其工作并保持一致,一切都应该以相同的方式处理,否则您将需要捕获一些异常,而其他异常则按照此类的意图进行处理。

      至于

      我会错过一些在执行“of”函数期间可能发生的严重异常吗?

      你不会想念他们的。它们被包裹在Try.Failure 中返回,您可以在收到错误后处理它们。

      【讨论】:

        【解决方案3】:

        之所以使用Throwable 而不是Exception,是因为我们希望我们的Try 对象也能捕获Errors。这就是ExceptionsErrors 的继承模型的样子:

        如果我们只捕获ExceptionsIOError 将使我们的代码崩溃并阻止我们使用Try 链的力量:

        Try.of(() -> throw new IOError(null))
          .onFailure(() -> /* Do something to fix the IOError */);
        

        当捕获Throwable时,这个IOError会被捕获,我们就能执行onFailure方法。如果我们只捕获Exception,则执行将在第一行停止,onFailure 将永远不会被执行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-27
          • 2011-01-17
          • 1970-01-01
          • 2020-01-24
          • 2023-02-06
          相关资源
          最近更新 更多