通常,finally
块保证执行.
但是,少数情况会在发生错误时强制CLR关闭.在这些情况下,finally
块不会运行.
一个这样的例子是存在StackOverflow异常.
例如,在下面的代码中,finally
不执行块.
static void Main(string[] args) {
try {
Foo(1);
} catch {
Console.WriteLine("catch");
} finally {
Console.WriteLine("finally");
}
}
public static int Foo(int i) {
return Foo(i + 1);
}
Run Code Online (Sandbox Code Playgroud)
我知道的另一种情况是终结器抛出异常.在这种情况下,该过程也会立即终止,因此保证不适用.
下面的代码说明了这个问题
static void Main(string[] args) {
try {
DisposableType d = new DisposableType();
d.Dispose();
d = null;
GC.Collect();
GC.WaitForPendingFinalizers();
} catch {
Console.WriteLine("catch");
} finally {
Console.WriteLine("finally");
}
}
public class DisposableType : IDisposable {
public void Dispose() {
}
~DisposableType() {
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,都处理之前终止catch
和finally
.
我承认这些例子非常人为,但它们只是为了说明这一点.
幸运的是,这种情况经常发生.
直接来自MSDN:
finally块对于清理try块中分配的任何资源非常有用.无论try块如何退出,控制总是传递给finally块.
catch用于处理语句块中发生的异常,而最终用于保证语句代码块的执行,而不管前面的try块是如何退出的.
http://msdn.microsoft.com/en-us/library/zwc8s4fz(VS.71,loband).aspx
归档时间: |
|
查看次数: |
10792 次 |
最近记录: |