一.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 { 退出前的處理動作,如保存數據等 } }