为什么订阅Application.ThreadException会吞下异常?

时间:2016-01-28 00:52:24

标签: c# multithreading winforms events exception

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

    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);
    }

然后吞下了异常。

为什么?

&安培;我怎样才能正常地向用户投掷?

1 个答案:

答案 0 :(得分:1)

reference source

就可以了
internal void OnThreadException(Exception t) {
    if (GetState(STATE_INTHREADEXCEPTION)) return;

    SetState(STATE_INTHREADEXCEPTION, true);
    try {
        if (threadExceptionHandler != null) {
            threadExceptionHandler(Thread.CurrentThread, new ThreadExceptionEventArgs(t));
        }
        else {
            if (SystemInformation.UserInteractive) {
                ThreadExceptionDialog td = new ThreadExceptionDialog(t);

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

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);
    }
}