java - 像这样嵌套 try/finally 子句安全吗?

标签 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();
}

具体来说,我很想知道 closeCursor() 是否保证在 closeDatabaseConnection() 之前被调用。嵌套 finally 子句是否应该被视为不良做法?

最佳答案

是的,这是有保证的。

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

(内层try异常→内层try的finally)这被认为是外层try的异常外层try的catch最终的外部尝试。

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

但为什么不这样做呢?

try {
  useCursor(cursor_id);
} catch(Exception e) {
  genericLogError();
} finally {
  closeCursor(cursor_id);
  closeDatabaseConnection();
}

关于java - 像这样嵌套 try/finally 子句安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15473599/

相关文章:

java - JSoup 返回不完整的 HTML 文档

java - jdb 调试时烦人的包名

java - 对 Java Swing 应用程序使用模型- View -演示者设计模式

Python:嵌套列表中元素的索引列表

ruby-on-rails - 嵌套对象表单未按预期工作

css - 多个css伪类

delphi - 空的 Try/Finally block 有什么用途吗?

java - Tomcat 8 启动多次 [LifecycleException]

Python:在循环中的 try-finally 语句中使用 continue

c# - C# 如何使用语句转换为 Try-Finally