在我的主窗体上,我订阅了两个事件:Application.ThreadException和Application.Idle。理论上,任何未捕获的异常都应该冒泡到主窗体。但是,如果OnIdle事件中发生异常,则不起作用。系统崩溃了。有谁知道如何解决这个问题?非常感谢。
答案 0 :(得分:3)
我同意不获取ThreadException事件是不合逻辑的。但它确实以这种方式工作,只有在消息循环调度事件并且事件处理程序中存在未处理的异常时才会引发ThreadException。当没有要再分派的消息时,会引发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。这是更好的方式。
答案 1 :(得分:0)
异常只会冒出一堆被调用的方法。
不会从您的表单代码中调用Idle事件,因此不会冒泡到您的任何代码。
相反,你必须抓住未经处理的例外。
看看:
其中一个将捕获您的异常。