.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         }
          View Code
        • 值得注意的是,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窗体线程异常 : 
          
          ";
          12                 MessageBox.Show(errorMsg + t.Exception.Message + Environment.NewLine + t.Exception.StackTrace);
          13             }
          14             catch
          15             {
          16                     MessageBox.Show("不可恢复的Windows窗体异常,应用程序将退出!");
          17             }
          18         }
          View Code
        • 值得注意的是,ThreadException可以阻止应用程序终止
    • 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窗体线程异常 : 
        
        ";
        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窗体线程异常 : 
        
        ";
        29                 MessageBox.Show(errorMsg + ex.Message + Environment.NewLine + ex.StackTrace);
        30             }
        31             catch
        32             {
        33                     MessageBox.Show("不可恢复的WPF窗体线程异常,应用程序将退出!");
        34             }
        35         }
        View Code
  • 多线程中的异常处理
    • try...catch放在线程中去处理异常,放在外面的话会捕获不到
原文地址:https://www.cnblogs.com/wyp1988/p/9928636.html