除了语法之外,有什么区别
try { } catch() { } finally { x = 3; }
和
try { } catch() { } x = 3;
编辑:在.NET 2.0中?
所以
try { throw something maybe x = 3 } catch (...) { x = 3 }
在行为上是等同的吗?
好吧,首先,如果您在try块中返回,则finally仍将运行,但try-catch-finally块下面列出的代码不会.
取决于语言,因为可能存在一些轻微的语义差异,但想法是它将(几乎)始终执行,即使try块中的代码引发异常.
在第二个示例中,如果catch块中的代码返回或退出,则不会执行x = 3.在第一个它会.
在.NET平台中,在某些情况下不会发生finally块的执行:安全异常,线程暂停,计算机关闭:)等.
在Java中:
最后总是被调用,无论异常是否在catch()中被正确捕获,或者实际上如果你有一个catch.
最后尝试抓住是非常重要的构造.您可以确定即使抛出异常,也会执行finally块中的代码.处理外部资源以释放它们非常重要.垃圾收集不会为您做到这一点.在最后一部分,你不应该有return语句或抛出异常.这样做是可能的,但这是一种不好的做法,可能导致不可预测的结果.
如果您尝试此示例:
try { return 0; } finally { return 2; }
结果将是2 :)
与其他语言的比较:从最后回归
有几件事使得finally块有用:
如果从try或catch块返回,则在将控制权返回给调用函数之前,finally块仍然执行
如果catch块中发生异常,或者try块中发生未捕获类型的异常,则仍会执行finally块中的代码.
这些使得finally块非常适合关闭文件句柄或套接字.