AFAIK、try和finally块用于执行一段可能抛出一些exception的代码,如果我们准备处理某些类型的异常和/或正在排除它们,比如FileIOException、AccessRight或其他东西,我们也会添加catch块。但当我运行这个..。
private void button1_Click(object sender, EventArgs e)
{
try
{
Environment.FailFast("It failed");
}
finally
{
MessageBox.Show("Done");
}
}它打破了一个例外,说
FatalExecutionEngineError检测到
消息:运行时遇到了致命错误。错误的地址是0x032526f4,线程0xd04。错误代码为0x80131623。此错误可能是CLR中的错误,也可能是用户代码中不安全或不可验证部分中的错误。此错误的常见来源包括COM-interop或PInvoke的用户封送错误,这可能会损坏堆栈.。
现在msdn说
通常,当未处理的异常结束应用程序时,是否运行最终块并不重要。但是,如果在一个即使在这种情况下也必须运行的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");
}
}同样的错误,它再次失败。至于CLR说最后的代码块总是运行(至少在添加了catch时),情况肯定不是这样。评论/意见有人吗?
这是快照..。

发布于 2013-03-02 11:14:33
这是故意的。Environment.FailFast的目的是立即停止执行。通过设计,它将不会在catch或最终块中运行任何代码。
文档说:
此方法终止进程而不运行任何活动的尝试/最后块或终结器。 FailFast方法将消息字符串写入日志,创建应用程序的转储,然后终止当前进程。在向Microsoft报告错误时还包含了messa字符串。 如果应用程序的状态损坏无法修复,则使用FailFast方法而不是Exit方法终止应用程序,执行应用程序的try/finally块和终结器将破坏程序资源。
这清楚地表明,最终块中的代码将不会运行。如果有一种使代码在Environment.FailFast之后运行的方法,那么这将使Environment.FailFast变得非常无用。它的存在是基于这样一个事实:您的代码在您调用它之后不执行。
您可以参考那些声明(强调我的)的文档:
通常,当未处理的异常结束应用程序时,是否运行最终块并不重要。但是,如果在一个即使在这种情况下也必须运行的finally块中有语句,那么一个解决方案就是在try-finally语句中添加一个catch块。
但这些话在这里根本不适用。您假设在调用Environment.FailFast时,未处理的异常将终止应用程序。情况并非如此。应用程序只是当场终止-没有未处理的异常。
https://stackoverflow.com/questions/15173774
复制相似问题