为什么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' 函数期间可能发生的一些严重异常吗?
Throwable
是 Exception
的超类,意味着 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
。这是 Exceptions
和 Errors
的继承模型的样子:
如果我们只捕获 Exceptions
,IOError
会使我们的代码崩溃并阻止我们使用 Try
链的强度:
Try.of(() -> throw new IOError(null))
.onFailure(() -> /* Do something to fix the IOError */);
在捕获Throwable
时,这个IOError
就会被捕获,我们就可以执行onFailure
方法了。如果我们只捕获 Exception
,执行将在第一行停止,并且 onFailure
永远不会执行。
我不是 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' 函数期间可能发生的一些严重异常吗?
Throwable
是 Exception
的超类,意味着 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
。这是 Exceptions
和 Errors
的继承模型的样子:
如果我们只捕获 Exceptions
,IOError
会使我们的代码崩溃并阻止我们使用 Try
链的强度:
Try.of(() -> throw new IOError(null))
.onFailure(() -> /* Do something to fix the IOError */);
在捕获Throwable
时,这个IOError
就会被捕获,我们就可以执行onFailure
方法了。如果我们只捕获 Exception
,执行将在第一行停止,并且 onFailure
永远不会执行。