上面的屏幕截图是一个 ThreadExceptionDialog。它显示在非常特殊的情况下,即 Winforms 应用程序在消息循环 (Application.Run) 触发的事件处理程序中爆炸,并且应用程序没有重新分配 Application.ThreadException 事件处理程序。使用它不是一个很好的做法,用户没有合理的方法可以知道是单击继续还是退出按钮。请务必调用 Application.SetUnhandledExceptionMode() 来禁用它。
底部的屏幕截图是默认的 Windows 错误报告对话框,当程序因未处理的异常而被轰炸时,Windows 会显示该对话框。你不应该让它达到这一点,对话框没有显示足够的信息来帮助任何人诊断和解决问题。始终为 AppDomain.CurrentDomain.UnhandledException 事件编写事件处理程序。显示和/或记录 e.ExceptionObject.ToString() 并调用 Environment.Exit() 以终止应用程序。
使您的 Program.cs 源代码看起来与此类似:
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Application.Run(new Form1());
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
// TODO: improve logging and reporting
MessageBox.Show(e.ExceptionObject.ToString());
Environment.Exit(-1);
}