java - 捕获多个Java异常时,如何在不写重复代码的情况下添加状态信息?

标签 java exception

我读过一些其他帖子,例如 this one关于避免在 Java catch block 中重复。显然,我真正想要的是“multi-catch”,但是鉴于 Java 7 还没有出现,是否有一个好的模式可以让我向异常添加状态,然后重新抛出它们, 没有 catching the kitchen sink

具体来说,我有一些进行库调用的代码,这些代码可能会引发异常,但没有提供足够的上下文来成功调试。我发现自己遇到了问题,然后进入,将库调用包装在 try/catch 中,捕获特定的异常,然后在 catch block 中添加额外的状态信息并重新抛出捕获的异常。然后我一遍又一遍地重复这个循环,每次都找到一个新的错误条件来记录。我结束了

try {
  make_library_call();
}
catch (SomeException e){
  throw new SomeException ("Needed local state information is " + importantInfo, e);
}
catch (SomeOtherException e){
  throw new SomeOtherException ("Needed local state information is " + importantInfo, e);
}
catch (YetAnotherException e){
  throw new YetAnotherException ("Needed local state information is " + importantInfo, e);
}

等等等等。我想我真正想看到的是

try {
  make_lib_call();
}
catch(Exception e){
  e.AddSomeInformationSomehow("Needed Info" + importantInfo);
  throw e;
}

假设在那种情况下 e 会在重新抛出时保持其实际运行时类型——在这种情况下,即使未检查捕获也可能没问题,因为我会重新抛出它们,并且他们也会从携带额外的状态信息中受益。我想替代品可能是这样的

try{
  make_lib_call();
}
finally {
  if (/*an exception happened*/)
    logger.debug("Some state info: " + importantInfo);
}

但是我不知道怎么写条件。这是疯了还是错了?

最佳答案

您可能预料到了这一点,但是,没有好的(好的,我的意思是干净的)方法来做到这一点。您可能会期待它,因为您下意识地知道如果有一个好的模式可以做到这一点,那么它可能不值得添加到 Java 7 中。

实际上是final rethrow您会发现在这种情况下非常方便的功能。

关于java - 捕获多个Java异常时,如何在不写重复代码的情况下添加状态信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3168317/

相关文章:

Python异常处理: Check return value of function

ruby - 捕获用于日志记录的 Ruby 异常,但不抛出它?

java - 玩WebSockets服务器推送示例

exception - 哪些编程语言没有运行时异常?

java - 如何保存桌面应用程序状态?

java - java中如何在函数名称和实际函数之间建立联系

java - 有没有抛出IO异常的情况?

java - 无法找到我的 Java 纸牌游戏的 hasNext() 和 next() 方法的符号

java - 记录改造到 Logback 记录器

java - 如何用JUNG2画直线?