.NET&C#的异常处理
- 应用程序未捕获异常的处理
- 处理未捕获的异常是每个应用程序起码有的功能
- 无论是Windows窗体程序还是WPF程序,我们都看到捕获的异常当中分为"窗体线程异常"和"非窗体线程异常"。
- WinForm等类型的应用程序
- 使用UnhandledException来处理非 UI 线程异常
-
1 static void Main(string[] args) 2 { 3 AppDomain.CurrentDomain.UnhandledException +=new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 4 } 5 6 static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 7 { 8 Exception error = (Exception)e.ExceptionObject; 9 Console.WriteLine("MyHandler caught : "+ error.Message); 10 }
- 值得注意的是,UnhandledException提供的机制并不能阻止应用程序终止,也就是说,CurrentDomain_UnhandledException方法执行后,应用程序就会被终止。
-
- 使用ThreadException来处理 UI 线程异常
-
1 [STAThread] 2 static void Main() 3 { 4 Application.ThreadException +=new ThreadExceptionEventHandler(UIThreadException); 5 } 6 7 private static void UIThreadException(object sender, ThreadExceptionEventArgs t) 8 { 9 try 10 { 11 string errorMsg ="Windows窗体线程异常 : \n\n"; 12 MessageBox.Show(errorMsg + t.Exception.Message + Environment.NewLine + t.Exception.StackTrace); 13 } 14 catch 15 { 16 MessageBox.Show("不可恢复的Windows窗体异常,应用程序将退出!"); 17 } 18 }
- 值得注意的是,ThreadException可以阻止应用程序终止。
-
- 使用UnhandledException来处理非 UI 线程异常
- WPF类型的应用程序
- WPF的UI线程和Windows的UI线程有点不一样。WPF的UI线程是交给一个叫做调度器的类:Dispatcher。
-
1 代码 2 3 public App() 4 { 5 this.DispatcherUnhandledException +=new DispatcherUnhandledExceptionEventHandler(Application_DispatcherUnhandledException); 6 AppDomain.CurrentDomain.UnhandledException +=new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 7 } 8 9 void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 10 { 11 try 12 { 13 Exception ex = e.ExceptionObject as Exception; 14 string errorMsg ="非WPF窗体线程异常 : \n\n"; 15 MessageBox.Show(errorMsg + ex.Message + Environment.NewLine + ex.StackTrace); 16 } 17 catch 18 { 19 MessageBox.Show("不可恢复的WPF窗体线程异常,应用程序将退出!"); 20 } 21 } 22 23 privatevoid Application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) 24 { 25 try 26 { 27 Exception ex = e.Exception; 28 string errorMsg ="WPF窗体线程异常 : \n\n"; 29 MessageBox.Show(errorMsg + ex.Message + Environment.NewLine + ex.StackTrace); 30 } 31 catch 32 { 33 MessageBox.Show("不可恢复的WPF窗体线程异常,应用程序将退出!"); 34 } 35 }
- 多线程中的异常处理
- try...catch放在线程中去处理异常,放在外面的话会捕获不到