Tha*_*tos 21 c# exception finally
拿这个代码:
using System;
namespace OddThrow
{
class Program
{
static void Main(string[] args)
{
try
{
throw new Exception("Exception!");
}
finally
{
System.Threading.Thread.Sleep(2500);
Console.Error.WriteLine("I'm dying!");
System.Threading.Thread.Sleep(2500);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这给了我这个输出:
Unhandled Exception: System.Exception: Exception!
at OddThrow.Program.Main(String[] args) in C:\Documents and Settings\username
\My Documents\Visual Studio 2008\Projects\OddThrow\OddThrow\Program.cs:line 14
I'm dying!
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么未处理的异常文本出现在finally之前?在我看来,在我们甚至不知道这个异常未处理之前,最终应该在堆栈展开时被执行.注意对Sleep()的调用 - 这些是在打印出未处理的异常之后发生的,就像它执行以下操作一样:
根据C#标准,§8.9.5,这种行为是错误的:
我哪里错了?(我有一些自定义控制台错误消息,这是在路上.轻微,只是烦人,让我质疑语言......)
标准关于执行顺序的陈述是正确的,并且与您观察的内容不一致.允许"未处理异常"消息出现在进程中的任何位置,因为它只是来自CLR的消息,实际上并不是异常处理程序本身.关于执行顺序的规则仅适用于在CLR内执行的代码,而不适用于CLR本身的代码.
你实际完成的是暴露一个实现细节,即通过查看我们所在的try {}块的堆栈来识别未处理的异常,而不是通过实际探索到root的所有方式.查看此堆栈可能会或可能不会处理异常,但是以这种方式识别未处理的异常.
您可能已经意识到,如果您在main函数中放置了一个顶级try {} catch {},那么您将看到您期望的行为:在检查下一帧的匹配catch之前,最终将执行每个函数{ }.