在C# 里,異常處理就是C# 為處理錯誤情況提供的一種機制。它為每種錯誤情況提供了定制的處理方式,並且把標識錯誤的代碼與處理錯誤的代碼分離開來。
對.NET類來說,一般的 異常類System.Exception 派生於 System.Object。還有許多定義好的異常類(如:System.SystemException、System.ApplicationException等),他們又派生於 System.Exception 類。其中System.ApplicationException 類是第三方定義的異常類,如果我們要自定義異常類,那么就應派生於它。
在代碼中對異常進行處理,一般要使用三個代碼塊:
Ø
Ø
Ø
二、異常處理
不管程序寫得再好,異常都可能會發生,而程序也必須能夠處理可能出現的錯誤。所以我們要站在異常一定可能會發生的角度來編寫異常處理程序,應對程序有可能發生的錯誤建立一個良好的異常處理策略。
異常產生的時候,我們想知道的是什么原因造成的錯誤以及錯誤的相關信息。我們可以根據實際情況拋出具體類型的異常,方便捕捉到異常時做出具體的處理。在編寫代碼過程中,可以使用系統已定義的相關異常類以及自定義的異常類來實例化並拋出我們需要的異常。如一個不可能實現的接口,我們可以拋出“System.NotSupportedExceptiion”的異常來告訴接口的調用者。
在處理異常的時候,我們應該將可處理的具體異常分別在catch 塊中做出相應處理,否則程序將終止運行。針對每一種異常,以不同方式處理,避免對所有異常做出一樣的處理。並且在異常產生時,給用戶一個友好的提示(普通用戶對異常的具體內容是不明白的,這就需要我們給出相關的簡要信息和解決方案,或則告之聯系管理員等。),並在可能的情況下給用戶提供可能的選擇(終止,重試,忽略),讓用戶來決定程序的運行方向。同時,要將異常做日志記錄。但不是所有異常都是必須記錄的,比如一些可預料並且能讓程序解決的錯誤我們就不需要記錄它。
記錄異常我們可以采取如下一些方式:
Ø
Ø
Ø
除了具體的、可預料到的異常外,還有未預料的異常。像這類異常是我們不願意看到了,但發生了也只能暫時結束程序的運行,這里如果做好了日志就能為我們解決和調試問題帶來了方便。還有,要避免使用了try-catch但沒有處理異常的情況,否則就相當於給異常放行(這種情況還不如根本就不去捕獲它)。
處理完異常,我們還應該注意在finally塊中釋放相關資源、還原相關設置信息等收尾工作。
在做異常處理的時候,最好能在應用程序所有的入口處(事件處理函數,主函數,線程入口)使用try-catch。 但是不要在程序構造函數入口處添加try-catch,因為此處產生異常,它自己並沒有能力來處理,因為它還沒有構造完畢,只能再向外層拋出異常。
在一般情況下使用異常機制來處理錯誤,能使整個程序的結構清晰、代碼簡單(標識錯誤的代碼與處理錯誤代碼分離),但我們也不能盲目使用異常。而且使用異常,可能會在一定程度上影響到程序的性能(C#中使用異常一般不影響性能)。對於一些簡單的、能夠提前避免的錯誤,我們還是應該在try塊外面及早做出處理。
C#異常類相關總結
C#異常類一、基類Exception
C#異常類二、常見的異常類
1、SystemException類:該類是System命名空間中所有其他異常類的基類。(建議:公共語言運行時引發的異常通常用此類)
2、ApplicationException類:該類表示應用程序發生非致命錯誤時所引發的異常(建議:應用程序自身引發的異常通常用此類)
C#異常類三、與參數有關的異常類
此類異常類均派生於SystemException,用於處理給方法成員傳遞的參數時發生異常
1、ArgumentException類:該類用於處理參數無效的異常,除了繼承來的屬性名,此類還提供了string類型的屬性ParamName表示引發異常的參數名稱。
2、FormatException類:該類用於處理參數格式錯誤的異常。
C#異常類四、與成員訪問有關的異常
1、MemberAccessException類:該類用於處理訪問類的成員失敗時所引發的異常。失敗的原因可能的原因是沒有足夠的訪問權限,也可能是要訪問的成員根本不存在(類與類之間調用時常用)
2、MemberAccessException類的直接派生類:
i、FileAccessException類:該類用於處理訪問字段成員失敗所引發的異常
ii、MethodAccessException類:該類用於處理訪問方法成員失敗所引發的異常
iii、MissingMemberException類:該類用於處理成員不存在時所引發的異常
C#異常類五、與數組有關的異常
以下三個類均繼承於SystemException類
1、IndexOutOfException類:該類用於處理下標超出了數組長度所引發的異常
2、ArrayTypeMismatchExcepti
3、RankException類:該類用於處理維數錯誤所引發的異常
C#異常類六、與IO有關的異常
1、IOException類:該類用於處理進行文件輸入輸出操作時所引發的異常。
2、IOException類的5個直接派生類:
i、DirectionNotFoundExcepti
ii、FileNotFoundException類:該類用於處理沒有找到文件而引發的異常。
iii、EndOfStreamException類:該類用於處理已經到達流的末尾而還要繼續讀數據而引發的異常。
iv、FileLoadException類:該類用於處理無法加載文件而引發的異常。
v、PathTooLongException類:該類用於處理由於文件名太長而引發的異常。
C#異常類七、與算術有關的異常
1、ArithmeticException類:該類用於處理與算術有關的異常。
2、ArithmeticException類的派生類:
i、DivideByZeroException類:表示整數貨十進制運算中試圖除以零而引發的異常。
ii、NotFiniteNumberException