检查是否执行了try或者最后执行了catch

时间:2018-04-03 13:32:22

标签: java exception exception-handling

是否可以检查移交给finally的控件是来自try还是其中一个catch? 类似的东西:

try {
    // Some code
} catch(Exception e) {
    // Some more code
} finally {
    // Check if control came from try or from catch?
}

3 个答案:

答案 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块太大并且捕获了应该被细分的各种错误。

正如其他人指出的那样,您可以使用标记来指示已达到某些点但通常不是最好的方法。