2

I'm not an expert in java's type system and exception handling. But i found in SO that we should only catch exceptions but not throwable's.

Here is the link: Difference between using Throwable and Exception in a try catch

In Vavr's library i found this source code:

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);
        }
    }
}

Would i have any issues in future if i will use this container? Will i miss some critical exceptions that may occur during execution of 'of' function?

4

3 回答 3

5

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

于 2019-12-02T21:00:58.797 回答
5

请注意链接帖子中的答案是什么:

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

强调我的。

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

至于

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

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

于 2019-12-02T21:01:30.870 回答
3

Throwable使用 , 代替的原因Exception是因为我们希望我们的Try对象也可以捕获Errors。这是他的继承模型的Exceptions样子Errors

在此处输入图像描述

如果我们只 catch Exceptions, anIOError会使我们的代码崩溃并阻止我们使用Try链的强度:

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

当catch 时Throwable, thisIOError将被捕获,我们将能够执行该onFailure方法。如果我们只 catch Exception,执行将在第一行停止,并且onFailure永远不会执行。

于 2020-01-16T16:05:21.930 回答