Sha*_*har 2 java intellij-idea try-catch-finally rethrow
我有一个负责日志记录操作的包装器,名为OperationWrapper.它的结构简单,如下:
public void runOperation(Operation o) throws Exception{
logOperationStarted();
o.execute();
logOperationFinished();
}
Run Code Online (Sandbox Code Playgroud)
由于"o"操作可以抛出异常,因此logOperationFinished()不会始终调用该方法,因此日志记录无法正常运行.
此外,调用该runOperation()方法的各种组件处理这些异常.
我想确保logOperationFinished()始终运行,我实现了以下结构:
public void runOperation(Operation o) throws Exception{
logOperationStarted();
try{
o.execute();
}
catch(Exception e){
throw e;
}
finally{
logOperationFinished();
}
}
Run Code Online (Sandbox Code Playgroud)
现在logOperationFinished()总是运行,但我收到IntelliJ的警告:
立即重新捕获捕获的异常
报告任何捕获块,其中立即重新捕获捕获的异常,而不对其执行任何操作.这种 捕获块是不必要的或缺乏错误处理.
对我来说,似乎IntelliJ在发出此警告时没有考虑finally块.
我做错了什么还是有更好的方法来实现这个目标?
谢谢.
是的,你不需要捕获
public void runOperation(Operation o) throws Exception{
logOperationStarted();
try{
o.execute();
}
finally{
logOperationFinished();
}
}
Run Code Online (Sandbox Code Playgroud)
使用JLS 14.20.2 中的 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();
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想使用 try-catch-finally 仍然不是问题,你可以忽略来自 IntelliJ 的警告,或者从 catch 块抛出新的异常。
throw new ExceptionYouWantToThrow(e);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1719 次 |
| 最近记录: |