C# 未调用Application.ThreadException

C# 未调用Application.ThreadException,c#,.net,winforms,exception,exception-handling,C#,.net,Winforms,Exception,Exception Handling,My WinForms应用程序安装Application.ThreadException事件处理程序以处理所有未处理的异常(处理程序显示一个对话框:发生错误,单击此处发送错误报告等) 问题是,当应用程序显示模式对话框时,不会调用我的事件处理程序。当我显示一个MessageBox或我的异常对话框时,所有异常都会被默默地吞噬。有办法抓住他们吗 下面是模拟此行为的WinForms应用程序示例。当此应用程序显示MessageBox时,后台引发的所有异常都将丢失(不调用ThreadException处理程

My WinForms应用程序安装Application.ThreadException事件处理程序以处理所有未处理的异常(处理程序显示一个对话框:发生错误,单击此处发送错误报告等)

问题是,当应用程序显示模式对话框时,不会调用我的事件处理程序。当我显示一个MessageBox或我的异常对话框时,所有异常都会被默默地吞噬。有办法抓住他们吗

下面是模拟此行为的WinForms应用程序示例。当此应用程序显示MessageBox时,后台引发的所有异常都将丢失(不调用ThreadException处理程序):

编辑。我已经更新了代码,使事情更加清楚。

当抛出异常时,MyForm会写入文本框:抛出NotImplementedException

调用ThreadException处理程序时,它会写入:ThreadException事件处理程序被调用。然后它会显示一个消息框

如果捕获到所有异常,我的文本框将显示以下内容:

Throwing a NotImplementedException! ThreadException event handler is called. Throwing a NotImplementedException! ThreadException event handler is called. Throwing a NotImplementedException! ThreadException event handler is called. Throwing a NotImplementedException! ThreadException event handler is called. Throwing a NotImplementedException! Throwing a NotImplementedException! 抛出一个NotImplementedException! 调用ThreadException事件处理程序。 抛出一个NotImplementedException! 调用ThreadException事件处理程序。 抛出一个NotImplementedException! 调用ThreadException事件处理程序。 但它显示:

Throwing a NotImplementedException! ThreadException event handler is called. Throwing a NotImplementedException! ThreadException event handler is called. Throwing a NotImplementedException! ThreadException event handler is called. Throwing a NotImplementedException! ThreadException event handler is called. Throwing a NotImplementedException! Throwing a NotImplementedException! 抛出一个NotImplementedException! 调用ThreadException事件处理程序。 抛出一个NotImplementedException!
抛出一个NotImplementedException 我试过你的程序,但对我来说似乎效果不错。ThrowUnhandledException被调用3次。这三条消息都会附加到文本框中

我尝试添加一个MessageBox:

ThrowUnhandledException(1);
ThrowUnhandledException(2);
ThrowUnhandledException(3);

MessageBox.Show("Hello");
但这也和预期的一样。我得到消息框,但如果我在异常处理程序上设置断点,它将被调用三次。当我关闭消息框时,我可以在MyForm窗口中看到所有三条消息。

您可以尝试替换

Application.ThreadException += (s, e) => MessageBox.Show("Error: " + e.Exception);


您将看到每次都会调用事件处理程序。

没错,所有三条消息都会附加到文本框中。但这些消息是在引发异常之前追加的。显示了多少个消息框?请尝试更新的代码示例。希望它能更清楚地说明问题。是的,这就是重点。显示MessageBox时不调用事件处理程序。尝试写入控制台,然后在处理程序中显示消息框。@yallie我明白你的意思。尝试使用
await
s序列化异步调用,如
await ThrowUnhandledException(
这部分代码只是一个模拟。在我的实际应用程序中,事件是异步发生的(即异步服务器调用引发异常)@yallie我建议解决这个问题。显示一个非模态表单,或者只是记下队列中的每个异常,然后逐个处理。谢谢你的建议,我已经尝试过了。异常表单不是我应用程序中唯一的模态表单,我只是不能强制所有表单都是非模态的。而且我不能拦截所有未处理的ex异常,因为未调用ThreadException处理程序。