我还阅读了其他一些文章,例如this one,以避免在Java 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);
}
但我不知道如何写条件那是疯狂的/错的吗?
解决方法:
您可能期望这样做,但是没有,没有一种很好的方法(而且我的意思是说干净)可以做到这一点.您可能期望如此,因为您下意识地知道,如果有一个很好的模式可以执行此操作,那么可能不值得将其添加到Java 7中.
在这种情况下,实际上是非常方便的final rethrow功能.
标签:exception,java
来源: https://codeday.me/bug/20191106/1999126.html