无论finally块中的内容是什么,它总是被执行(几乎),那么将代码封闭到它或不封闭它之间有什么区别呢?


当前回答

假设您需要将光标设置回默认指针,而不是等待(沙漏)光标。如果在设置光标之前抛出异常,并且没有完全崩溃应用程序,则可能会留下一个令人困惑的光标。

其他回答

啊…我想我明白你的意思了!我花了一点时间……你可能想知道“为什么把它放在finally块中,而不是放在finally块之后,并且完全在try-catch-finally之外”。

例如,这可能是因为抛出错误时您正在停止执行,但您仍然希望清理资源,例如打开的文件、数据库连接等。

无论是否存在异常,finally块中的代码都将被执行。当涉及到某些需要经常运行的内务功能(如关闭连接)时,这非常方便。

现在,我猜你的问题是你为什么要这样做:

try
{
    doSomething();
}
catch
{
    catchSomething();
}
finally
{
    alwaysDoThis();
}

什么时候你可以这样做:

try
{
    doSomething();
}
catch
{
    catchSomething();
}

alwaysDoThis();

答案是,catch语句中的代码很多时候要么会重新抛出异常,要么会跳出当前函数。对于后一种代码,如果catch语句内的代码发出返回或抛出新异常,则“alwaysDoThis();”调用将不会执行。

finally块对于清理try块中分配的任何资源以及运行即使出现异常也必须执行的任何代码很有价值。无论try块如何退出,控件总是传递给finally块。

最后,如:

try {
  // do something risky
} catch (Exception ex) {
  // handle an exception
} finally {
  // do any required cleanup
}

是try. catch块之后执行代码的保证机会,而不管try块是否抛出异常。

这使得它非常适合于释放资源、db连接、文件句柄等。

使用try-finally的大多数优点已经指出了,但我想再加上这一点:

try
{
    // Code here that might throw an exception...

    if (arbitraryCondition)
    {
        return true;
    }

    // Code here that might throw an exception...
}
finally
{
    // Code here gets executed regardless of whether "return true;" was called within the try block (i.e. regardless of the value of arbitraryCondition).
}

这种行为使它在各种情况下都非常有用,特别是当您需要执行清理(处置资源)时,尽管在这种情况下使用块通常更好。