2013-03-02 236 views
3

据我所知,tryfinally块是用来执行一段代码,可能会引发一些exception,我们还添加catch块,如果我们准备处理一些异常类型和/或被除外它们,就像FileIOExceptionAccessRight什么的。但是,当我跑了一个例外,这个..CLR中的错误? CLR执行引擎失败

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块运行是否 并不重要。但是,如果在即使在这种情况下必须运行的finally块中有 语句, 解决方法之一就是将try块添加到try-finally语句中。

所以,我添加了catch块,但它仍然说了同样的事情。

private void button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      Environment.FailFast("It failed"); 
     } 
     catch (Exception ex) 
     { 

     } 
     finally 
     { 
      MessageBox.Show("Done"); 
     } 
    } 

它再次失败,同样的错误。至于CLR说最后的代码块总是运行的(至少在添加catch的时候),肯定不是这种情况。评论/意见任何人?

而且这里的快照..

enter image description here

回答

7

这是由设计。 Environment.FailFast的目的是立即停止执行。按照设计,它不会在catch或finally块中运行任何代码。

documentation说:

该方法终止进程不运行任何活性 的try /最后块或终结。

FailFast方法将消息字符串写入Windows 应用程序事件日志,创建应用程序的转储,然后 终止当前进程。 messa字符串也包含在向Microsoft报告的 错误中。

使用FAILFAST方法,而不是退出方法来终止您 的应用程序,如果你的应用程序的状态被损坏无法修复, 和执行应用程序的尝试/ finally块和终结 会破坏程序的资源。

这表明你的finally块中的代码不会运行。如果有一种方法在Environment.FailFast之后运行代码,那么这会使Environment.FailFast几乎无用。它的存在取决于您的代码在您调用它之后不会执行的事实。

你指向的文件,指出(重点煤矿):

通常情况下,当未处理的异常终止应用程序,finally块运行与否并不重要。但是,如果在finally块中有语句,即使在这种情况下也必须运行,一种解决方案是将catch块添加到try-finally语句中。

但是这些词根本不适用于此。您假定当您拨打Environment.FailFast时,未处理的异常会终止该应用程序。事实并非如此。该应用程序只是当场终止 - 没有未处理的异常。

相关问题