C#編程(八十)---------- 異常類


異常類

在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類:表示浮點數運算中出現無窮打或者非負值時所引發的異常。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM