使用AFAIK,try
和finally
块执行一段可能会抛出一些exception
的代码,如果我们准备处理某些代码,我们还会添加catch
块异常类型和/或除外,例如FileIOException
,AccessRight
或其他内容。但当我跑这个..
private void button1_Click(object sender, EventArgs e)
{
try
{
Environment.FailFast("It failed");
}
finally
{
MessageBox.Show("Done");
}
}
它打破一个例外并说
检测到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");
}
}
它再次失败并出现同样的错误。至于CLR说最终总是运行代码块(至少在添加catch时),情况肯定不是这样。评论/意见谁?
这里也是快照..
答案 0 :(得分:7)
这是设计的。 Environment.FailFast
的目的是立即停止执行。按照设计,它不会在catch或finally块中运行任何代码。
此方法终止进程而不运行任何活动进程 尝试/终止块或终结器。
FailFast方法将消息字符串写入Windows 应用程序事件日志,然后创建应用程序的转储 终止当前进程。梅萨字符串也包括在内 向Microsoft报告错误。
使用FailFast方法而不是Exit方法来终止你的 申请状态如果损坏无法修复, 并执行您的应用程序的try / finally块和终结器 将破坏计划资源。
这清楚表明finally块中的代码不会运行。如果有一种方法可以在Environment.FailFast
之后运行代码,那么会导致Environment.FailFast
几乎没用。它的存在是基于你的代码在调用之后不执行的事实。
你指的是陈述的文件(强调我的):
通常,当未处理的异常结束应用程序时,无论finally块是否运行都不重要。但是,如果在finally块中有语句,即使在这种情况下也必须运行,一种解决方案是在try-finally语句中添加一个catch块。
但这些话根本不适用于此。您假设在调用Environment.FailFast
时,未处理的异常会终止应用程序。事实并非如此。该应用程序刚刚终止 - 没有未处理的异常。