Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查try是在finally中执行的还是catch是在finally中执行的_Java_Exception_Exception Handling - Fatal编程技术网

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嗯,你永远不知道天才在编什么是的,没错:)