C# 为什么订阅Application.ThreadException会吞并该异常?

C# 为什么订阅Application.ThreadException会吞并该异常?,c#,multithreading,winforms,events,exception,C#,Multithreading,Winforms,Events,Exception,假设我在消息循环中有一个异常抛出: private void timer1_Tick(object sender, EventArgs e) { throw new Exception("yehaaaa!!!!"); } 默认情况下,这会向用户抛出并显示通用错误对话框。(这就是我想要的) 但是,如果我将以下订阅添加到Application.ThreadException: Application.ThreadException += new Th

假设我在消息循环中有一个异常抛出:

    private void timer1_Tick(object sender, EventArgs e)
    {
        throw new Exception("yehaaaa!!!!");
    }
默认情况下,这会向用户抛出并显示通用错误对话框。(这就是我想要的)

但是,如果我将以下订阅添加到Application.ThreadException:

    Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);

    private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
    {
        //_raygunClient.Send(e.Exception);
    }
然后这个例外被吞没了

为什么?


&我怎样才能让它正常地扔给用户呢?

在以下位置就可以了:

如果存在处理程序,则会调用该处理程序,否则会运行一些标准代码。如果要显示标准对话框,请使用
ThreadExceptionDialog
并以相同的方式处理对话框结果。在我自己的代码中,有这样一种效果,似乎是有效的:

private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
    Exception exception = e.Exception;
    _Logger.Error(e.Exception, "An unhandled forms application exception occurred");

    // Show the same default dialog
    if (SystemInformation.UserInteractive)
    {
        using (ThreadExceptionDialog dialog = new ThreadExceptionDialog(exception))
        {
            if (dialog.ShowDialog() == DialogResult.Cancel)
                return;
        }

        Application.Exit();
        Environment.Exit(0);
    }
}

就在那里,在:

如果存在处理程序,则会调用该处理程序,否则会运行一些标准代码。如果要显示标准对话框,请使用
ThreadExceptionDialog
并以相同的方式处理对话框结果。在我自己的代码中,有这样一种效果,似乎是有效的:

private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
    Exception exception = e.Exception;
    _Logger.Error(e.Exception, "An unhandled forms application exception occurred");

    // Show the same default dialog
    if (SystemInformation.UserInteractive)
    {
        using (ThreadExceptionDialog dialog = new ThreadExceptionDialog(exception))
        {
            if (dialog.ShowDialog() == DialogResult.Cancel)
                return;
        }

        Application.Exit();
        Environment.Exit(0);
    }
}

奇怪的是,仅仅订阅事件就足以改变行为——这似乎不是事件模式的正确用法!谢谢。太奇怪了,仅仅订阅事件就足以改变行为——这似乎不是事件模式的正确用法!谢谢