異常類
在C#里,異常處理就是C#為處理錯誤情況提供的一種機制.它為每種錯誤情況提供了定制的處理方式,並且把標志錯誤的代碼預處理錯誤的代碼分離開來.
對.net類來說,一般的異常類System.Exception派生於System.Object.還有許多定義好的異常類(例如:System.SystemExpection,SYstem.ApplicationException等),他們又派生於System.Exception類.其中System.ApplicationException類是第三方定義的異常類,如果我們要自定義異常類,那么就應派生於它.
在代碼中對異常進行處理,一般要使用三個代碼塊:
第一個代碼塊:Try塊的代碼是程序中可能出現錯誤的操作部分.
第二個代碼塊是:Catch塊的代碼塊用來處理各種錯誤的部分(可以有多個).必須正確排列捕獲異常的catch子句,范圍小的Exception放在前面的catch.即如果Exception之間存在繼承關系,就應把子類的Exception放在前面的catch子句中
第三個代碼塊:finally快的代碼用來傾力資源或執行要在try塊末尾執行的其他操作(可以省略).且無論是否產生異常,Finally塊都會執行.
異常處理
不管程序寫的多好,異常都有可能發生,而程序也必須能夠處理異常.所以我們要站在異常一定可能會發生的角度來編寫異常處理程序,應對程序有可能發生的錯誤建立一個良好的異常處理策略.
異常產生的時候,我們想知道是什么情況導致了錯誤或異常.我們可以根據實際情況拋出具體類型的異常,方便捕捉到異常時做出具體的處理.在編寫代碼的過程中,可以使用系統已經定義好的相關異常類以及自定義的異常類,=來實例化並拋出我們需要的異常.如一個不可能實現的接口,我們可以拋出”System.NotSupportedException”的異常來告訴接口的調用者.
在處理異常的時候,我們應該將可處理的具體異常分別在catch塊中做出相應處理,否則程序將終止運行.針對每一個異常,以不同的方式處理,避免對所有異常做出一樣的處理.就像醫生不能給孕婦和感冒開一樣的葯.我們在開開葯的時候,是不是會被告訴一次吃多少,忌冷啥的注意事項,相同的道理,在異常產生的時候,需要給用戶一個有好的提示(普通用戶對異常的具體內容是不明白,這就需要我們給出相關的簡要信息和解決方案,或告之聯系方式,例如,我們懷孕了,懷孕的原理是啥?是什么導致懷孕?懷孕產生的效果是啥?咱們一般人可能不知道,我們只能收出現孕吐的情況了,咋辦,找醫生,咱們只是知道孕吐這是不正常的,這就出現了異常),並在可能的情況下給用戶提供可能的選擇(終止,重試,忽略),讓用戶來決定從程序的運行方法.同時,要將異常做日志記錄(病例).但不是所有的異常都必須記錄的,比如一些可預料並且能讓程序解決的錯誤我們就不需要記錄它.
記錄異常我們可以采取以下方式:
1.在文件中記錄異常,便於技術人員查看發生了什么情況,從而能改進程序.
2.在數據庫中記錄異常.數據庫支持查詢,這樣在后期就能夠對異常進行分類查詢等操作,便於查看與管理
3.在Eventlog中記錄:能夠遠程操作,方便系統管理員監控所有計算的異常.
除了具體的,可預料的異常外,(后面我要說啥?你猜?),還有未預料的錯誤,這類錯誤通常我們不願意看到,但是肯定會發生,就像醫生不願意看到癌症的病例一樣(因為代表着這個人不行了,應聲通常希望大家都能好好的活着,別出現什么大病,我們還是要相信這個世界上還有好醫生).但是這些不願意看到的異常也只能暫時結束程序的運行,這里如果做好了日志就能為我們解決和調試問題帶來了方便.還有,要避免使用try-catch但沒有處理異常的情況,否則就相當於給異常放行(你有病,醫生告訴你改則治,你不治.這就不行了,那你還去看醫生干啥,,耽誤醫生救死扶傷).
處理完異常后,我們還要注意在finally塊中釋放資源,還原相關設置信息等收尾工作,也就是你的病好了以后,需要辦理出院手續,和護士姐姐告個別.
在做異常處理的時候,最好能在應用程序所有的入口處(事件處理函數,主函數,線程入口)使用try-catch.但是不要在程序構造函數入口處添加try-catch,因為此處產生異常,他自己並沒有能力處理,因為他還沒有構造完畢,只能再想外層拋出異常.
在一般的情況下使用異常處理機制來處理錯誤,能是整個程序的結構清晰,代碼簡單(標志錯誤的代碼預處理錯誤代碼分離),但我們也不能盲目使用異常.而且使用異常,可能會在一定程度上影響程序的性能(C#中使用異常一般不會影響性能).對於一些簡單的,能夠提前避免的錯誤,我們還是應該在try塊外面及早做出處理.
了解了基礎的東西,再來看一下C#異常類相關總結
需要知道的是C#中所有的異常類,不管使自定義的,還是系統定義的,他們的基類都是Exception
另外說一下C#常見的異常類(沒必要記住):知道有這么回事,你可以不看,不記,但是我不能不寫.
異常類名 |
說明 |
SystemException |
該類是System命名空間中所有其他異常類的基類。(建議:公共語言運行時引發的異常通常用此類) |
ApplicationException |
該類表示應用程序發生非致命錯誤時所引發的異常(建議:應用程序自身引發的異常通常用此類) |
與參數相關的異常類 |
|
ArgumentException |
該類用於處理參數無效的異常,除了繼承來的屬性名,此類還提供了string類型的屬性ParamName表示引發異常的參數名稱。 |
FormatException |
該類用於處理參數格式錯誤的異常 |
與成員訪問有關的異常 |
|
MemberAccessException |
該類用於處理訪問類的成員失敗時所引發的異常。失敗的原因可能的原因是沒有足夠的訪問權限,也可能是要訪問的成員根本不存在(類與類之間調用時常用) |
MemberAccessException |
見下備注 |
與數組相關的異常類 |
|
IndexOutOfException |
該類用於處理下標超出了數組長度所引發的異常 |
ArrayTypeMismatchException |
該類用於處理在數組中存儲數據類型不正確的元素所引發的異常 |
RankException |
該類用於處理維數錯誤所引發的異常 |
與IO有關的異常類 |
|
IOException |
該類用於處理進行文件輸入輸出操作時所引發的異常。詳細見下備注 |
與算數相關的異常類 |
|
ArithmeticException |
該類用於處理與算術有關的異常,詳細見下備注 |
備注:
MemberAccessException類的直接派生類:
i、FileAccessException類:該類用於處理訪問字段成員失敗所引發的異常
ii、MethodAccessException類:該類用於處理訪問方法成員失敗所引發的異常
iii、MissingMemberException類:該類用於處理成員不存在時所引發的異常
IOException類的5個直接派生類:
i、DirectionNotFoundException類:該類用於處理沒有找到指定的目錄而引發的異常。
ii、FileNotFoundException類:該類用於處理沒有找到文件而引發的異常。
iii、EndOfStreamException類:該類用於處理已經到達流的末尾而還要繼續讀數據而引發的異常。
iv、FileLoadException類:該類用於處理無法加載文件而引發的異常。
v、PathTooLongException類:該類用於處理由於文件名太長而引發的異常。
ArithmeticException類的派生類:
i、DivideByZeroException類:表示整數貨十進制運算中試圖除以零而引發的異常。
ii、NotFiniteNumberException類:表示浮點數運算中出現無窮打或者非負值時所引發的異常。