为什么vavr的Try容器捕获Throwable却捕获不到Exception?

Why does vavr's Try container catches Throwable but not Exception?

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

这是 link: 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' 函数期间可能发生的一些严重异常吗?

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

请注意链接 post 中的 answer 所说的内容:

You should generally not do that, except perhaps at the very highest "catch all" level of a thread where you want to log or otherwise handle absolutely everything that can go wrong.

强调我的。

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

至于

Will i miss some critical exceptions that may occur during execution of 'of' function?

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

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

如果我们只捕获 ExceptionsIOError 会使我们的代码崩溃并阻止我们使用 Try 链的强度:

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

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