立即重新抛出catch块并最终使用

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块.

我做错了什么还是有更好的方法来实现这个目标?

谢谢.

Sca*_*bat 5

是的,你不需要捕获

public void runOperation(Operation o) throws Exception{ 
     logOperationStarted();
     try{
       o.execute();
     }
     finally{
       logOperationFinished();
     }
}
Run Code Online (Sandbox Code Playgroud)


Sum*_*ngh 2

使用JLS 14.20.2 中的 try-finally 块。执行try-finally

如果 try 块的执行由于任何其他原因突然完成 R,则执行 finally 块,然后有一个选择:

  1. 如果finally 块正常完成,则try 语句会由于原因R 突然完成。

  2. 如果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)