Java 检查try是在finally中执行的还是catch是在finally中执行的
是否可以检查最终移交给Java 检查try是在finally中执行的还是catch是在finally中执行的,java,exception,exception-handling,Java,Exception,Exception Handling,是否可以检查最终移交给的控件是否来自try或catch中的一个? 比如: try { // Some code } catch(Exception e) { // Some more code } finally { // Check if control came from try or from catch? } 在Java中没有自动完成这项工作的方法。您可以创建布尔标志: boolean isRaised = false; try { // Some c
的控件是否来自try
或catch
中的一个?
比如:
try {
// Some code
} catch(Exception e) {
// Some more code
} finally {
// Check if control came from try or from catch?
}
在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");
}
最好不要。
一般情况是:
try {
someCodePossiblyRaisingAnException;
preFinalOkayCode;
} catch (AbcException | DefException e) {
preFinalFailedCode;
} finally {
finalCode;
}
尤其是使用非特定异常被大多数IDE和代码检查器认为是糟糕的风格
可能是使用异常的代码表明了对通用解决方案的需求,并且重复了好几次。在这种情况下,让调用方传播异常。例如,使用java swing let按钮操作可以通过以下方式捕获异常:
protected ExceptionlessButton { // Or Action
@Override
public final void actionPerformed(ActionEvent evt) {
try {
onAction(e);
} catch (Exception e) {
...
}
}
abstract protected void onAction(ActionEvent evt);
}
在本例中,最终代码似乎属于最终代码之前的任何一个部分。当考虑尝试使用通常甚至可以消除finally块的资源时,您可能会重新考虑这种推广的必要性
Result f() throws SQLException {
try (PreparedStatement stm = ...) {
someCodePossiblyRaisingAnException;
preFinalOkayCode;
return result;
}
}
作为一种替代方案,您认为:
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;//?
如果目标是在catch
案例之后继续,则可能需要在(private
)函数中执行此操作
我之所以提出这一点,是因为finally
子句的思想是,无论是正常还是异常处理控制流发生,都要执行代码,问题是专门寻找在这两种情况下执行不同代码的方法。这似乎与目的背道而驰
我们有一个模式!这是一个catch
处理程序
试图弄明白这是一种“代码气味”的代码。
这可能是因为try
块太大,捕捉到了各种应该细分的错误
正如其他人指出的那样,您可以使用标志来表示达到了某些点,但这通常不是最好的方法。您可以添加一个System.out.println()
在catch块中…使用布尔值
,在中使用true
进行初始化,然后在catch
中尝试和false
我真的很想知道为什么要这样做。对我来说,这听起来像是你试图用你的try/catch来控制流量,这是一种反作用-pattern@Bartzilla我只是好奇而已。不会在实际代码中使用此选项。请使用断点并使用调试器、使用打印输出或带有打印输出的布尔标志。可能是您可以使用的所有可能性。如果您使用更多代码加载catch
块(在设置布尔值之前),这可能会导致爆炸,您可以为try
执行代码,因为在try
和之间根本没有不同的值
@XtremeBaumer设置布尔值应该是catch块中发生的第一件事“应该”并不能保证它。使用布尔值
可以简单地消除这种情况risk@xxxvodnikxxx嗯,你永远不知道天才在编什么是的,没错:)