1. 程式人生 > >.NET&C#的異常處理

.NET&C#的異常處理

args inf win 分享圖片 線程 patch tro handler environ

  • 應用程序未捕獲異常的處理
    • 處理未捕獲的異常是每個應用程序起碼有的功能
    • 無論是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窗體線程異常 : \n\n"; 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窗體線程異常 : \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         }
        View Code
  • 多線程中的異常處理
    • try...catch放在線程中去處理異常,放在外面的話會捕獲不到

.NET&C#的異常處理