【发布时间】: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。它不能再窄了。