關於C#中的異常捕捉

一.c#中的異常清單c#

    

Exception:全部異常對象的基類。
  SystemException:運行時產生的全部錯誤的基類。
  IndexOutOfRangeException:當一個數組的下標超出範圍時運行時引起。
  NullReferenceException:當一個空對象被引用時運行時引起。
  InvalidOperationException:當對方法的調用對對象的當前狀態無效時,由某些方法引起。

  ArgumentException:全部參數異常的基類。
  ArgumentNullException:在參數爲空(不容許)的狀況下,由方法引起。
  ArgumentOutOfRangeException:當參數不在一個給定範圍以內時,由方法引起。
  InteropException:目標在或發生在CLR外面環境中的異常的基類。
  ComException:包含COM類的HRESULT信息的異常。
  SEHException:封裝Win32結構異常處理信息的異常。
  SqlException:封裝了SQL操做異常。

    常見具體的異常對象:

  ArgumentNullException 一個空參數傳遞給方法,該方法不能接受該參數
  ArgumentOutOfRangeException 參數值超出範圍
  ArithmeticException 出現算術上溢或者下溢
  ArrayTypeMismatchException 試圖在數組中存儲錯誤類型的對象
  BadImageFormatException 圖形的格式錯誤
  DivideByZeroException 除零異常
  DllNotFoundException 找不到引用的DLL
  FormatException 參數格式錯誤
  IndexOutOfRangeException 數組索引超出範圍
  InvalidCastException 使用無效的類
  InvalidOperationException 方法的調用時間錯誤
  NotSupportedException 調用的方法在類中沒有實現
  NullReferenceException 試圖使用一個未分配的引用
  OutOfMemoryException 內存空間不夠
  StackOverflowException 堆棧溢出

try catch中儘可能使用具體的異常,避免使用system.Exception  數組

 

 

二. 異常處理須要注意的地方
1)Catch和Finally代碼應該很是短,並且成功率極高,避免本身又拋出一個異常。不然CLR會終止進程,避免安全漏洞或者不可預知的後果。這個相似於Windows藍屏,發生了嚴重的錯誤,寧願使系統不可用。
2)Catch塊儘可能避免直接捕捉異常的基類Exception,而應該捕捉具體的異常類。
 
三.針對.net未捕獲的異常的處理
  未捕獲異常從定義上說就是結構化異常處理未能捕獲的異常。通俗的講就是發生在Try Catch塊意外的異常。那麼是否是咱們在Main函數中加一個Try Catch 塊就能夠捕獲所有未捕獲異常了呢?答案是否認的。這裏面有兩種狀況沒法經過這種方法捕獲:
  1.GC產生的異常,
  2. 主線程之外的線程引起的未捕獲的異常。這些異常咱們每每能夠在線程的主函數中用Try Catch 來捕獲,但若是系統中使用了外部的組件,或者甚至是.Net 框架自帶的一些  系統組件,由這些組件的線程引起的異常,調用代碼沒法經過Try Catch來捕獲。
  鑑於此,咱們須要經過一些方法來截獲這些未捕獲異常,並進行適當處理。
   .Net 的設計者已經考慮到這些問題,而且爲咱們提供了一個叫 UnhandledExceptionEventHandler 的事件,經過這個事件,咱們能夠截獲未捕獲異常,並進行處理
   .net 2.0之後,若是程序發現有未捕獲的異常,會終止程序(這個就是形成程序未知crash的緣由?),因此使用 UnhandledExceptionEventHandler能夠記錄下程序發生未捕獲異常的位置,方便優化程序。
  wpf中的添加方法:
    在app.xaml.cs中添加    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(<自定義的事件處理方法>);
    自定義的事件處理方法以下:
      
        static void UnhandledExceptionEventHandler(object sender, UnhandledExceptionEventArgs e)         
{           
          try{ 
                using (System.IO.FileStream fs = new System.IO.FileStream(@"c:\testme.log", 
                         System.IO.FileMode.Append, System.IO.FileAccess.Write))
 
                { 
                    using (System.IO.StreamWriter w = new System.IO.StreamWriter(fs, 
                             System.Text.Encoding.UTF8))
                    {                 
                          w.WriteLine(e.ExceptionObject);                   
                    }                 
                }             
             }            
           catch             
                {    退出前的處理動做,如保存數據等 }         
  }            
相關文章
相關標籤/搜索