.NET 4中的新HandleProcessCorruptedStateExceptions属性

时间:2010-06-02 06:27:31

标签: .net exception exception-handling crash

我正在尝试崩溃我的WPF应用程序,并使用上面的新.NET 4属性捕获异常。

我设法通过调用Environment.FailFast("crash");手动崩溃我的应用程序。 (我还设法使用来自“How to simulate a corrupt state exception in .NET 4?”的汉斯代码来崩溃它。)

按下按钮时,应用程序会调用上面的崩溃代码。 这是我的异常处理程序:

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

        DispatcherUnhandledException += app_DispatcherUnhandledException;
    }

    [HandleProcessCorruptedStateExceptions]
     void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        //log..
    }

    [HandleProcessCorruptedStateExceptions]
     void CurrentDomain_FirstChanceException(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e)
    {
        //log..
    }

    [HandleProcessCorruptedStateExceptions]
     void app_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
    {
        //log..
    }

上面显示的//log...评论仅供参考;那里有真正的日志记录代码。

在Visual Studio中运行时,会抛出异常,但它不会“冒泡”到这些异常处理程序块。 当作为独立运行时(没有附加调试器),我没有得到任何日志,尽管我期望。

为什么会这样,以及如何处理代码?

3 个答案:

答案 0 :(得分:5)

该属性必须放在包含try / catch而不是事件处理程序的方法中。

我对this question

的回答中提供了一个示例

答案 1 :(得分:2)

  1. FailFast()的目的是立即退出,这就是不调用处理程序的原因。
  2. 甚至一些'腐败状态异常'也无法被这些处理程序捕获 - 一个重要的例子是StackOverflowException(我实际上试图在ASP.NET应用程序中捕获一个并且它不起作用,尽管该属性存在)。
  3. 答案基于这篇文章:www.naveenbhat.in/2013/02/tips-and-tricks-of-exception-handling_28.html

答案 2 :(得分:1)

必须使用[HandleProcessCorruptedStateExceptions][SecurityCritical]标记事件处理程序才能触发事件处理程序。 FirstChanceExceptionUnhandledException的备注部分提到了此要求。

DispatcherUnhandledException的评论并未声明您可以处理其中的损坏状态异常,因此可能无法使用该事件。

另请注意,在备注中,强烈建议您在约束执行区域内创建FirstChanceException,以防止无限循环的堆栈溢出或内存不足异常。