C# CLR中的Bug?CLR执行引擎失败
好的,C# CLR中的Bug?CLR执行引擎失败,c#,c#-4.0,clr,C#,C# 4.0,Clr,好的,try和最后使用块执行一段可能引发一些异常的代码,如果我们准备处理某种类型的异常和/或正在排除它们,我们也会添加catch块,比如FileIOException,AccessRight或其他什么。但是当我运行这个 private void button1_Click(object sender, EventArgs e) { try { Environment.FailFast("It failed"); }
try
和最后使用块执行一段可能引发一些异常的代码,如果我们准备处理某种类型的异常和/或正在排除它们,我们也会添加catch
块,比如FileIOException
,AccessRight
或其他什么。但是当我运行这个
private void button1_Click(object sender, EventArgs e)
{
try
{
Environment.FailFast("It failed");
}
finally
{
MessageBox.Show("Done");
}
}
它破例说
检测到FATAlexecutionEngineer错误
消息:运行时遇到致命错误。错误地址位于线程0xd04上的0x032526f4。错误代码为0x8013623。此错误可能是CLR或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM interop或PInvoke的用户封送错误,这可能会损坏堆栈。
现在说
通常,当未处理的异常结束应用程序时,无论
最后一个块是否运行并不重要。然而,如果你有
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说finally中的代码块总是运行的(至少在添加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
时,未经处理的异常会终止应用程序。事实并非如此。应用程序只是当场终止,没有未处理的异常