2
try
{
    operation1();
    operation2();
    ...
}
finally
{
    try
    {
        finalizer_operation1();
        finalizer_operation2();

    }
    finally
    {
        very_critical_finalizer_operation_which_should_occurs_at_the_end();
    }
}

这个可以吗?将终结器作为另一个try/finally块(因为finalizer_operationX()可能会抛出,我必须确保very_critical...()最后会发生。

快速谷歌搜索try in finally 块什么都没有(如果你给我一个重复的链接,会删除问题),它应该可以工作,但我不确定它的设计和可能的问题。

4

2 回答 2

9

我不会这样写代码。我不喜欢嵌套 try/catch/finally 结构。我更喜欢每种方法一个。

我的偏好是将这些调用中的每一个都包装在自己的方法中。

try
{
    operation1();
    operation2();
    ...
}
finally
{
    cleanup();
}

public void cleanup() {
    try
    {
        finalizer_operation1();
        finalizer_operation2();

    }
    finally
    {
        very_critical_finalizer_operation_which_should_occurs_at_the_end();
    }
}
于 2014-11-12T13:29:44.720 回答
2

当然是。如果控制流进入相应的finally块,执行一个try块。

唯一的例外是关闭 VM 的调用。

于 2014-11-12T13:29:10.860 回答