在开发中,我们并不能考虑到所有异常,在应用程序出现异常,会抛出一个不友好的界面,并且很多代码信息会显示。如下图:
从图中我们可以看到,是因为索引超出了数组界限,如何统一抛出一个友好提示,并且屏蔽掉敏感信息?在Winfrom中可以使用Application.ThreadException 事件,此事件允许 Windows 窗体应用程序处理 Windows 窗体线程中所发生的其他未经处理的异常。请将事件处理程序附加到 ThreadException 事件以处理这些异常,因为这些异常将使您的应用程序处于未知状态。应尽可能使用结构化异常处理块来处理异常。若要使用此事件,必须在调用 Application.Run 之前附加一个处理程序。因为这是一个静态事件,所以释放应用程序时必须分离事件处理程序,否则会导致内存泄漏。
我们在Application.Run方法之前加上如下代码
- Application.ThreadException += (object sender, ThreadExceptionEventArgs e) =>
- {
- if (MessageBox.Show("系统检测到未知异常,是否退出", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes) Application.Exit();
- };
- Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
再次运行如图:
提示:并不能捕获所有异常,未捕获异常可以使用AppDomain.CurrentDomain.UnhandledException事件,具体参阅MSDN:AppDomain.UnhandledException 事件
WFP中使用如下:
- protected override void OnStartup(StartupEventArgs e)
- {
- Application.Current.DispatcherUnhandledException += (object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs de) =>
- {
- de.Handled = true;
- if (MessageBox.Show("系统检测到未知异常,是否退出", "提示", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
- Application.Current.Shutdown();
- };
- base.OnStartup(e);
- }