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

Ale*_*rov 2 java exception vavr

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

这是链接: 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*ion 5

Throwable是 的超类Exception,意味着catch (Throwable var)也捕获异常。因此 vavr 中的代码是正确的 - 每当抛出任何Throwable异常时,它都会被包装在Try.Failure.


Car*_*ate 5

请注意链接帖子中的答案所说的内容:

通常,您不应该这样做,除非在线程的最高“捕获所有”级别,您想要记录或以其他方式处理绝对可能出错的所有内容

强调我的。

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

至于

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

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