我有一个负责日志操作的包装器,名为OperationWrapper。它的结构很简单,如下:
public void runOperation(Operation o) throws Exception{
logOperationStarted();
o.execute();
logOperationFinished();
}
由于“o”操作可以抛出异常,因此不会始终调用logOperationFinished()
方法,因此日志记录无法正常运行。
此外,调用runOperation()
方法的各种组件处理这些异常。
我想确保logOperationFinished()
始终运行,我实现了以下结构:
public void runOperation(Operation o) throws Exception{
logOperationStarted();
try{
o.execute();
}
catch(Exception e){
throw e;
}
finally{
logOperationFinished();
}
}
现在logOperationFinished()
总是运行,但我收到IntelliJ的警告:
立即重新捕获被捕异常
报告捕获的异常所在的任何 catch 块 立即重新投入,不对其采取任何行动。这样 catch 块是不必要的或缺少错误处理。
对我来说,似乎IntelliJ在发出此警告时没有考虑finally块。
我做错了什么或者有更好的方法来实现这个目标吗?
感谢。
答案 0 :(得分:5)
是的,你不需要捕获
public void runOperation(Operation o) throws Exception{
logOperationStarted();
try{
o.execute();
}
finally{
logOperationFinished();
}
}
答案 1 :(得分:1)
使用JLS 14.20.2. Execution of try-finally
中的try-finally块如果try块的执行由于任何其他原因R突然完成,则执行finally块,然后有一个选择:
如果finally块正常完成,则try语句突然完成,原因为R。
- 醇>
如果finally块因为S而突然完成,那么try语句突然完成原因S(并且原因R被丢弃)。
public void runOperation(Operation o) throws Exception{
logOperationStarted();
try{
o.execute();
}finally{
logOperationFinished();
}
}
如果你想使用try-catch-finally仍然不是问题,你可以忽略IntelliJ的警告,或者从catch块中抛出新的异常。
throw new ExceptionYouWantToThrow(e);
答案 2 :(得分:0)