3

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

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

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

我的问题是:我应该像上面那样拦截并重新抛出Exceptions,还是应该也拦截Throwables? 如果Error发生,是否有机会

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

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

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

同样,我应该只截取Exceptions,还是也截取Throwables?忽略而不是重新抛出Errors 似乎更有问题。

4

2 回答 2

1

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

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

但是,在任何一种情况下,根据工具包的性质和对丢失错误的潜在影响,捕获它也可能是有意义的。

于 2013-03-08T21:18:43.217 回答
1

我相信,如果您正在处理用户提供的代码,您可以一无所知,那么您应该捕获可抛出的(在这两种情况下),考虑不影响整个系统的链接错误,只是执行代码,例如:NoSuchMethodErrorNoClassDefFoundError

如果您想在错误影响整个系统的情况下放弃,那么您无法捕获或重新抛出像OOME这样扩展VirtualMachineError的错误。

于 2013-03-08T21:32:53.727 回答