C#之異常處理

1.什么是異常?

異常實際上是程序中錯誤導(dǎo)致中斷了正常的指令流的一種事件.

2.異常處理的優(yōu)點:


觀察前面的程序你會發(fā)現(xiàn)大部分精力花在出錯處理上了.只把能夠想到的錯誤考慮到,對以外的情況無法處理霉赡,程序可讀性差暇藏,出錯返回信息量太少报强。

綜合上面的說法和傳統(tǒng)的方法比較異常的優(yōu)點:

1.把錯誤代碼從常規(guī)代碼中分離出來姿现。

2.把錯誤傳播給調(diào)用堆棧:

M1=>M2=>M3? M3異常 =>M2 =>M1=>...=>Main=>CLR

3. 按錯誤類型和錯誤差別分組。

4. 系統(tǒng)提供了對于一些無法預(yù)測的錯誤的捕獲和處理鸯匹。

5. 克服了傳統(tǒng)方法的錯誤信息有限的問題慨削。

3.何時使用異常機制旨涝?

1.當(dāng)方法因為自身無法控制的原因而不能完成其任務(wù),

???? 文件不存在驾锰,網(wǎng)絡(luò)連接無法建立……卸留,

2.處理在方法、類庫椭豫、類中拋出的例外耻瑟,

???? 如FileInputStream.read產(chǎn)生IOException旨指,

3.在大的項目中采用統(tǒng)一的方式處理例外時,

???? 如編寫一個文字處理器喳整,

4.例外應(yīng)該是不經(jīng)常發(fā)生但卻可能發(fā)生的故障谆构,

???? 一定發(fā)生的事件不應(yīng)該用例外機制來處理,

5.例外處理用于使系統(tǒng)從故障中恢復(fù)框都。

???? 提示信息/不產(chǎn)生無效的結(jié)果/釋放資源搬素。

注意事項:

1.不同的例外處理策略

???? 關(guān)鍵性應(yīng)用(處理所有例外)

???? 實驗軟件(可以忽略許多例外)

2.終止程序會導(dǎo)致資源泄漏,利用例外處理釋放資源魏保。

3.盡可能近地處理例外熬尺,這樣程序清晰易讀。

4.能在局部處理的錯誤不要使用例外機制谓罗。

???? 例外機制的處理比正常處理效率低粱哼。

簡單的異常實例



異常的分類

只要在程序執(zhí)行過程中出現(xiàn)錯誤,.NET Framework 就會創(chuàng)建一個 Exception 對象詳細(xì)描述此錯誤檩咱。在 .NET Framework 中揭措,Exception 為所有異常類的基類。

從 Exception 類派生的異常分為兩種類別:

SystemException \ ApplicationException税手。


一個例外是由一個對象來代表的蜂筹,

所有的例外都直接或間接地繼承自Exception類。

注意:

用戶也可以通過繼承已有的例外類來定義自己的例外類芦倒,并在程序中使用(利用throw產(chǎn)生或拋出艺挪,catch捕捉并處理)。

常見的異常類

一些常見的 System 異常包括:

ArgumentException:

在調(diào)用某方法時兵扬,傳遞的參數(shù)中至少有一個不符合所調(diào)用方法的參數(shù)規(guī)范麻裳。

ArgumentNullException:

調(diào)用方法時所傳遞的參數(shù)中,至少有一個在任何情況下都不應(yīng)為 null器钟。

ArgumentOutOfRangeException:

調(diào)用方法時津坑,如果在傳遞給該方法的參數(shù)中至少有一個不為null且不包含有效值時,引發(fā)該異常傲霸。

ArithmeticException:操作將導(dǎo)致上溢或下溢疆瑰。

ArrayTypeMismatchException:

當(dāng)試圖在數(shù)組中存儲類型不正確的元素時引發(fā)的異常。

DivideByZeroException:

試圖用零除整數(shù)值或十進(jìn)制數(shù)值時引發(fā)的異常昙啄。

DllNotFoundException:

當(dāng)未找到在 DLL 導(dǎo)入中指定的 DLL 時所引發(fā)的異常穆役。

IndexOutOfRangeException:

使用了大于數(shù)組或集合大小的索引。

InsufficientMemoryException:

當(dāng)檢測到?jīng)]有足夠的可用內(nèi)存時引發(fā)的異常梳凛。無法繼承此類耿币。

InvalidCastException:

因無效類型轉(zhuǎn)換或顯式轉(zhuǎn)換引發(fā)的異常。

InvalidOperationException:

當(dāng)方法調(diào)用對于對象的當(dāng)前狀態(tài)無效時引發(fā)的異常韧拒。

NotImplementedException:

在無法實現(xiàn)請求的方法或操作時引發(fā)的異常淹接。

NotSupportedException:

當(dāng)調(diào)用的方法不受支持十性,或試圖讀取或?qū)懭氩恢С值牧鲿r引發(fā)的異常。

NullReferenceException:

在將引用設(shè)置為有效實例之前使用了引用的屬性或方法塑悼。

OutOfMemoryException:

沒有足夠的內(nèi)存繼續(xù)執(zhí)行程序時引發(fā)的異常

OverflowException:

在選中的上下文中的算術(shù)運算劲适、類型轉(zhuǎn)換或轉(zhuǎn)換操作導(dǎo)致溢出時引發(fā)的異常。

FormatException:

參數(shù)或操作數(shù)格式不正確拢肆。



使用:


try語句:異常監(jiān)視塊


作用:監(jiān)視該代碼塊是否有異常發(fā)生减响,若有異常,產(chǎn)生異常對象并拋出

注意:在該代碼塊中聲明的變量無法在該塊之外訪問


catch語句:異常處理代碼塊

作用:捕捉try語句中拋出的異常郭怪,并按照代碼塊中的語句處理

格式:

catch(異常種類){//處理語句}

catch(異常種類 引用名(一般叫e)){//處理語句}:

注意:

1.每個try語句必須伴隨1-n個catch語句支示。

2.例外總是由距離產(chǎn)生例外最近的匹配catch代碼段處理。

3.try-catch可以嵌套使用:

如果沒有相應(yīng)的例外處理

???? 則例外被交給上一層try代碼段進(jìn)行處理鄙才。

4.匹配的catch執(zhí)行完畢后颂鸿,同級的catch將被忽略。

5.先catch小的再catch老的攒庵。

6.整個執(zhí)行流程中若無catch處理 程序中斷嘴纺!

7.catch的類型應(yīng)盡量精確。

8.請注意你調(diào)用的方法是否有可能拋出異常浓冒。

9.catch中也可能產(chǎn)生異常 會拋給嵌套的上一級處理栽渴。

10.處理過的異常可以繼續(xù)拋出 以期通知流程中的所有節(jié)點有異常稳懒。

catch (Exception e) { throw e; }闲擦。

11.try-catch機制不該被用于流程控制,例外情形應(yīng)該是很稀少的场梆,而不是經(jīng)常性的墅冷。


一定會執(zhí)行的程序塊---finally

異常處理的統(tǒng)一出口


finally:

?????1.捕獲例外的最后一步是通過finally語句為例外處理提供一個統(tǒng)一的出口,使得在控制流程轉(zhuǎn)到程序的其他部分以前或油,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)一的管理寞忿。

?????2.無論try所指定的程序塊中是否拋出例外,也無論catch語句的例外類型是否與所拋棄的例外的類型一致顶岸,finally所指定的代碼都要被執(zhí)行腔彰,它提供了統(tǒng)一的出口。(finally語句與switch中的default語句是不同的O接丁)

?????3.通常在finally語句中可以進(jìn)行資源的清除工作萍桌,如關(guān)閉打開的文件、刪除臨時文件等凌简。

finally和return的關(guān)系:

1.當(dāng)try和catch中有return時,finally仍然會執(zhí)行恃逻;

2.finally是在return后面的表達(dá)式運算后執(zhí)行的(此時并沒有返回運算后的值雏搂,而是先把要返回的值保存起來藕施,不管finally中的代碼如何修改,返回的值都不會改變凸郑,仍然是之前保存的值)裳食,所以函數(shù)返回值是在finally執(zhí)行前確定的;

3.finally中不可以有return芙沥,否則語法錯誤


拋出異常:


throw ExceptionObj;

拋出異常: 不是出錯產(chǎn)生,而是人為地拋出

1.任何從Exception派生的類都可以用throw語句拋出诲祸,拋出例外用來表明程序遇到的錯誤無法正常執(zhí)行而需要例外處理

throw new MyException(“some infomation”);

2.例外拋出點后的代碼在拋出例外后不再執(zhí)行

也可以說例外的拋出終止了代碼段的執(zhí)行


自定義異常:不是由系統(tǒng)監(jiān)測到的異常(下標(biāo)越界,被0-除等),而是由用戶自己定義的異常.


形如:建議ApplicationException作為父類

class MyException : ApplicationException{….}

注意:

用戶定義的異常同樣要用try--catch捕獲,但必須由用戶自己拋出

throw new MyException(參數(shù)).




總結(jié)

1.一般格式:正常程序和出錯處理分離開來


2.把異常傳播給堆棧,沿著被調(diào)用的順序往前尋找,只要找到符合該異常種類徹底異常處理程序,就交給這部分程序去處理


3.異常可以人為地拋出,用throw new 語句而昨。

4.異尘嚷龋可以是系統(tǒng)已經(jīng)定義好的,也可以是用戶自己定義的。

5.用戶自己定義的異常一定繼承自Exception類 一般繼承自ApplicationException歌憨。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末着憨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子务嫡,更是在濱河造成了極大的恐慌甲抖,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件心铃,死亡現(xiàn)場離奇詭異准谚,居然都是意外死亡,警方通過查閱死者的電腦和手機去扣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門柱衔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人厅篓,你說我怎么就攤上這事秀存。” “怎么了羽氮?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵或链,是天一觀的道長。 經(jīng)常有香客問我档押,道長澳盐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任令宿,我火速辦了婚禮叼耙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘粒没。我一直安慰自己筛婉,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布癞松。 她就那樣靜靜地躺著爽撒,像睡著了一般入蛆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上硕勿,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天哨毁,我揣著相機與錄音,去河邊找鬼源武。 笑死扼褪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粱栖。 我是一名探鬼主播话浇,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼查排!你這毒婦竟也來了凳枝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤跋核,失蹤者是張志新(化名)和其女友劉穎岖瑰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砂代,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡蹋订,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了刻伊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片露戒。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捶箱,靈堂內(nèi)的尸體忽然破棺而出智什,到底是詐尸還是另有隱情,我是刑警寧澤丁屎,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布荠锭,位于F島的核電站,受9級特大地震影響晨川,放射性物質(zhì)發(fā)生泄漏证九。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一共虑、第九天 我趴在偏房一處隱蔽的房頂上張望愧怜。 院中可真熱鬧,春花似錦妈拌、人聲如沸拥坛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渴逻。三九已至疾党,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惨奕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工竭钝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留梨撞,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓香罐,卻偏偏與公主長得像卧波,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子庇茫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容