finally块有什么意义?

Kes*_*shi 30 .net design-patterns exception try-catch-finally

除了语法之外,有什么区别

try {
}
catch() {
}
finally {
    x = 3;
}
Run Code Online (Sandbox Code Playgroud)

try {
}
catch() {
}

x = 3;
Run Code Online (Sandbox Code Playgroud)

编辑:在.NET 2.0中?


所以

try {
    throw something maybe
    x = 3
}
catch (...) {
    x = 3
}
Run Code Online (Sandbox Code Playgroud)

在行为上是等同的吗?

Jos*_*man 37

好吧,首先,如果您在try块中返回,则finally仍将运行,但try-catch-finally块下面列出的代码不会.


Vin*_*vic 34

取决于语言,因为可能存在一些轻微的语义差异,但想法是它将(几乎)始终执行,即使try块中的代码引发异常.

在第二个示例中,如果catch块中的代码返回或退出,则不会执行x = 3.在第一个它会.

在.NET平台中,在某些情况下不会发生finally块的执行:安全异常,线程暂停,计算机关闭:)等.

  • 我会添加阻止执行finally块*Environment.Exit*调用的方法列表. (2认同)

SCd*_*CdF 10

在Java中:

最后总是被调用,无论异常是否在catch()中被正确捕获,或者实际上如果你有一个catch.


Bar*_*ski 9

最后尝试抓住是非常重要的构造.您可以确定即使抛出异常,也会执行finally块中的代码.处理外部资源以释放它们非常重要.垃圾收集不会为您做到这一点.在最后一部分,你不应该有return语句或抛出异常.这样做是可能的,但这是一种不好的做法,可能导致不可预测的结果.

如果您尝试此示例:

try {
  return 0;
} finally {
  return 2;
}
Run Code Online (Sandbox Code Playgroud)

结果将是2 :)

与其他语言的比较:从最后回归

  • Java 中的结果将为 2。在 C# 中,无法编译此代码。 (2认同)

wvd*_*hel 6

有几件事使得finally块有用:

  1. 如果从try或catch块返回,则在将控制权返回给调用函数之前,finally块仍然执行
  2. 如果catch块中发生异常,或者try块中发生未捕获类型的异常,则仍会执行finally块中的代码.

这些使得finally块非常适合关闭文件句柄或套接字.