据我所知,try和finally块是用来执行一段代码可能抛出一些exception,我们还加catch块,如果我们准备处理一些异常类型和/或在它们以外,像FileIOException,AccessRight或什么的.但是当我跑这个..
private void button1_Click(object sender, EventArgs e)
{
try
{
Environment.FailFast("It failed");
}
finally
{
MessageBox.Show("Done");
}
}
Run Code Online (Sandbox Code Playgroud)
它打破了一个例外并说
检测到FatalExecutionEngineError
消息:运行时遇到致命错误.错误的地址位于线程0xd04处的0x032526f4处.错误代码是0x80131623.此错误可能是CLR中的错误,也可能是用户代码的不安全或不可验证部分中的错误.此错误的常见来源包括COM-interop或PInvoke的用户编组错误,这可能会破坏堆栈.
现在msdn说
通常,当未处理的异常结束应用程序时,无论finally块是否运行都不重要.但是,如果在finally块中有语句,即使在这种情况下也必须运行,一种解决方案是在try-finally语句中添加一个catch块.
所以,我添加了catch块,但它仍然说同样的事情.
private void button1_Click(object sender, EventArgs e)
{
try
{
Environment.FailFast("It failed");
}
catch (Exception ex)
{
}
finally
{
MessageBox.Show("Done");
}
}
Run Code Online (Sandbox Code Playgroud)
它再次失败并出现同样的错误.至于CLR说最终总是运行代码块(至少在添加catch时),情况肯定不是这样.评论/意见谁?
还有这里的快照..

这是设计的.目的Environment.FailFast是立即停止执行.通过设计,它不会在catch或finally块中运行任何代码.
该文件说:
此方法终止进程而不运行任何活动的try/finally块或终结器.
FailFast方法将消息字符串写入Windows应用程序事件日志,创建应用程序的转储,然后终止当前进程.Messa字符串也包含在向Microsoft的错误报告中.
如果应用程序的状态损坏无法修复,则使用FailFast方法而不是Exit方法终止应用程序,并且执行应用程序的try/finally块和终结器将损坏程序资源.
这清楚表明finally块中的代码不会运行.如果有一种方法可以让代码在Environment.FailFast那之后运行,那将会变得Environment.FailFast毫无用处.它的存在是基于您调用它后代码不执行的事实.
你指出的文件(强调我的):
通常,当未处理的异常结束应用程序时,无论finally块是否运行都不重要.但是,如果在finally块中有语句,即使在这种情况下也必须运行,一种解决方案是在try-finally语句中添加一个catch块.
但这些话根本不适用于此.您假设在调用时Environment.FailFast,未处理的异常终止了应用程序.事实并非如此.该应用程序刚刚在现场终止 - 没有未处理的异常.