嵌套这样的try/finally子句是否安全?

Ste*_*han 6 java nested try-finally

由于这是一个关于try/finally子句行为的学术问题,我试图使用一个非常通用的例子.嵌套像这样的try/finally子句有什么危险吗?

openDatabaseConnection();
try {
    // Methods unrelated to cursor
    // ...

    String cursor_id = openCursor();
    try {
        useCursor(cursor_id);
    } finally {
        closeCursor(cursor_id);
    }

    // Methods unrelated to cursor
    // ...
} catch (Exception e) {
    genericLogError();
} finally {
    closeDatabaseConnection();
}
Run Code Online (Sandbox Code Playgroud)

具体来说,我很想知道closeCursor()以前是否保证会被调用closeDatabaseConnection().有没有理由嵌套一个finally子句,应该被认为是不好的做法?

Mar*_*oun 5

是的,这是有保证的。

假设在期间发生了一些异常useCursor(cursor_id),现在将执行内部 finally块。(因为异常发生在内部try块中)。在这之后genericLogError()将被调用(因为在try包含内部的外部发生了异常try。并且只有在它closeDatabasConnection()被执行之后(finally外部的try)。这是一个可以更好地解释它的图表:

(内部尝试中的异常?内部尝试的最后)这被认为是外部 try 的例外抓住外部尝试最后的外部尝试。

您可以通过从块打印来测试它。

但为什么不这样做呢?

try {
  useCursor(cursor_id);
} catch(Exception e) {
  genericLogError();
} finally {
  closeCursor(cursor_id);
  closeDatabaseConnection();
}
Run Code Online (Sandbox Code Playgroud)