在我的主窗体上,我订阅了两个事件:Application.ThreadException 和 Application.Idle。理论上,任何未捕获的异常都应该冒泡到主窗体。但是,如果异常发生在 OnIdle 事件中,则此方法不起作用。系统就崩溃了。有谁知道如何解决这个问题?非常感谢。
最佳答案
我同意不获取 ThreadException 事件并不是很合乎逻辑。然而它确实以这种方式工作,仅当消息循环调度事件并且事件处理程序中存在未处理的异常时才会引发 ThreadException。当不再有消息要分派(dispatch)时,会引发 Idle 事件,它遵循完全不同的代码路径。
您可以通过自己在 Idle 事件处理程序中捕获异常来解决此问题:
void Application_Idle(object sender, EventArgs e) {
try {
// Do stuff
}
catch (Exception ex) {
Application.OnThreadException(ex);
}
}
请注意,如果您让用户决定是否退出或继续程序,那么 ThreadException 是一件喜忧参半的事情。另请注意,它不够通用,无法捕获程序中的所有异常,您仍然需要 AppDomain.CurrentDomain.UnhandledException 来处理 UI 线程以外的线程中引发的异常或之前引发的异常消息循环开始运行。
如果您这样做是为了确保用户无法单击“继续”,则只需使用 Application.SetUnhandledExceptionMode() 来完全禁用 ThreadException 事件。现在一切都通过 AppDomain.UnhandledException 进行。这是更好的方法。
关于winforms - OnIdle 事件中的异常不会冒泡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2876748/