gpt4 book ai didi

java - 运行用户提供的代码的控件库是否应该拦截异常或 Throwable?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:30:10 25 4
gpt4 key购买 nike

我在这里看到了很多关于 ExceptionThrowable 之间区别的一般性问题。我知道其中的区别,而且我有一个更具体的问题。

我正在编写一个库,用于绑定(bind)并运行多个用户提供的代码片段。如果其中一个部分失败,则整个计算将被丢弃。为了保持资源使用干净,用户还可以提供在此类事件发生时运行的终结器。模式是这样的:

try {
// process ...
} catch (Exception ex) {
runRegisteredFinalizers();
throw ex;
}

我的问题是:我应该像上面那样拦截并重新抛出Exception,还是应该拦截Throwable如果错误发生,是否有可能

  • JVM 会恢复吗? (那么运行终结器有什么意义吗?)
  • JVM 将处于实际可以运行它们的状态?

此外,在运行终结器时,我捕获并忽略它们的异常,以便其他已注册的终结器有机会运行,例如:

  try {
finalizer.run();
}
catch (Exception ex) {
log.error("Exception in a finalizer", ex);
}

同样,我应该只拦截 Exception 还是同时拦截 Throwable?忽略而不是重新抛出 Error 似乎更有问题。

最佳答案

也许最安全的做法是捕获 Throwable(或分别捕获 Exception 和 Error)并将捕获到的内容的引用传递给 runRegisteredFinalizers(),让用户有机会决定这是否是他们应该关心的事情.

但是,您将捕获的错误要么是特定于您的工具包(不一定来自用户代码),要么是用户没有考虑到的错误(假设他们自己捕获了案例)。在这些情况下,异常类型无关紧要。

不过,在任何一种情况下,根据您的工具包的性质和遗漏错误的潜在影响,捕捉错误也可能是有意义的。

关于java - 运行用户提供的代码的控件库是否应该拦截异常或 Throwable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15303035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com