【问题标题】:How do I add state information without writing repetitive code when catching multiple Java exceptions?捕获多个Java异常时,如何在不编写重复代码的情况下添加状态信息?
【发布时间】:2010-07-02 18:44:38
【问题描述】:

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

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

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);
}

但我不知道如何写条件。这是疯了/错了吗?

【问题讨论】:

  • 如果你按照你的建议重新抛出,你的方法必须有throws Exception。它不能再窄了。

标签: java exception


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    替代方案:

    boolean isOk = false;
    try{
      make_lib_call();
      isOk = true;
    }
    finally {
      if (!isOk)
        logger.debug("Some state info: " + importantInfo);
    }
    

    【讨论】:

    • 你是正确,我只是希望这不是答案——我想到了这个,但它有点笨拙。感觉就像我会在 C 中做的事情 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多