有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是否应该创建一个运行用户提供的代码的控制库来拦截异常或丢弃?

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

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

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

我的问题是:我应该像上面那样截取和重新截取Exception,还是也应该截取Throwable如果发生Error,是否有可能

  • JVM会恢复吗?(运行终结器有什么意义吗?)
  • JVM将处于这样一种状态,实际上可以运行它们吗

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

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

同样,我应该只截取Exception还是同时截取Throwable呢?忽略和不重新引用Error似乎问题更大


共 (2) 个答案

  1. # 1 楼答案

    我相信,如果你处理的是用户提供的代码,你可以不承担任何责任,那么你应该捕获可投掷(在这两种情况下),考虑不影响整个系统的链接错误,只是执行代码类似:NoSuchMethodErrorNoClassDefFoundError

    如果您希望在发生影响整个系统的错误时放弃,那么您无法捕获或重新播放扩展VirtualMachineError的错误,如OOME

  2. # 2 楼答案

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

    但是,您将捕获的错误可能是特定于您的工具包(不一定来自用户代码)的,也可能是用户没有解释的(假设他们自己捕获了案例)。在这些情况下,异常的类型并不重要

    不过,在这两种情况下,根据工具箱的性质和丢失错误的潜在影响,捕获错误也可能是有意义的