是否可以检查移交给finally
的控件是来自try
还是其中一个catch
?
类似的东西:
try {
// Some code
} catch(Exception e) {
// Some more code
} finally {
// Check if control came from try or from catch?
}
答案 0 :(得分:5)
在Java中没有自动化的方法。您可以创建一个布尔标志:
boolean isRaised = false;
try {
// Some code
}
catch (Exception e) {
isRaised = true;
}
finally {
if (isRaised)
System.out.println("from catch");
else
System.out.println("from try");
}
答案 1 :(得分:4)
最好不要。
一般模式是:
try {
someCodePossiblyRaisingAnException;
preFinalOkayCode;
} catch (AbcException | DefException e) {
preFinalFailedCode;
} finally {
finalCode;
}
大多数IDE和代码检查器都特别使用非特定的Exception。
可能是使用Exception的代码表示需要一般解决方案,并且重复多次。在这种情况下,让调用者传播异常。例如,使用java swing,按钮操作通过以下方式捕获异常:
protected ExceptionlessButton { // Or Action
@Override
public final void actionPerformed(ActionEvent evt) {
try {
onAction(e);
} catch (Exception e) {
...
}
}
abstract protected void onAction(ActionEvent evt);
}
在所提出的案例中,最终代码似乎属于任何一个前期代码部分。在考虑 try-with-resources 时,通常甚至可以消除finally块,您可能会重新考虑这种泛化的必要性。
Result f() throws SQLException {
try (PreparedStatement stm = ...) {
someCodePossiblyRaisingAnException;
preFinalOkayCode;
return result;
}
}
答案 2 :(得分:0)
作为替代方案如何:
try {
// Some code
} catch(Exception e) {
// Some more code
//Code to execute for case where object thrown goes here.
return; //Maybe return false or re-throw...
} finally{
//Code to execute regardless of whether exception is thrown.
}
//Code to execute if no exception is thrown...
//return true;//?
如果目标是在private
案例之后继续,则可能需要在(catch
)函数中。
我只是提出这个问题,因为finally
子句的概念是它是执行的代码,无论正常处理控制流程或异常处理控制流程是否发生,问题都是专门寻找方法在这两种情况下执行不同的代码。所以似乎与目的背道而驰。
我们有一个模式!这是一个catch
处理程序!
试图弄明白的代码就是“代码味道”。
这可能是因为try
块太大并且捕获了应该被细分的各种错误。
正如其他人指出的那样,您可以使用标记来指示已达到某些点但通常不是最好的方法。