異常基礎(chǔ)---《clr via c#》筆記
2012-01-30 18:15 海不是藍(lán) 閱讀(445) 評(píng)論(0) 收藏 舉報(bào)|
try |
一個(gè)try塊至少有一個(gè)關(guān)聯(lián)的catch或finally塊,單獨(dú)的try塊沒(méi)有意義而且是錯(cuò)誤的。
重點(diǎn):
如果在一個(gè)try塊執(zhí)行多個(gè)可能拋出同一個(gè)異常類(lèi)型的操作,但是不同的操作有不同的異常恢復(fù)措施,就應(yīng)該將每一個(gè)操作都放到它自己的try塊中。
|
catch |
一個(gè)try塊可以關(guān)聯(lián)0個(gè)或多個(gè)catch塊。注意:如果try塊沒(méi)有關(guān)聯(lián)catch塊,那么必須關(guān)聯(lián)一個(gè)finally塊,否則無(wú)法編譯通過(guò)。
CLR異常的捕捉
clr是自上向下搜索一個(gè)匹配的catch塊,所以應(yīng)該把較具體的異常放到頂部,也就是說(shuō)首先出現(xiàn)的是派生程度最大的異常類(lèi)型。接著是它們的基類(lèi)型。如果弄反了這個(gè)順序,那么就會(huì)編譯錯(cuò)誤,因?yàn)檫@樣的catch塊是不可達(dá)的。
try { }
catch (Exception ex) { }
catch (IOException ex) { }
finally { }
上面的代碼就會(huì)編譯失敗。錯(cuò)誤1上一個(gè) catch 子句已經(jīng)捕獲了此類(lèi)型或超類(lèi)型(“System.Exception”)的所有異常
未處理的異常
起因:try塊拋出一個(gè)異常
過(guò)程:clr將搜索捕捉異常類(lèi)型與拋出異常相同的catch塊,如果沒(méi)有任何捕捉類(lèi)型與拋出的異常類(lèi)型匹配,那么clr會(huì)去調(diào)用棧的更高一層去搜索一個(gè)與異常匹配的捕捉類(lèi)型。
結(jié)果:如果clr都調(diào)用到了棧的頂部,還是沒(méi)有找到一個(gè)具有匹配捕捉類(lèi)型的一個(gè)catch塊,就會(huì)發(fā)生一個(gè)未處理的異常。
拋出異常后finally的執(zhí)行
try
{
try { }
finally { }
}
catch (IOException ex) { }
finally { }
一旦clr找到一個(gè)具有匹配捕捉類(lèi)型的catch塊,就會(huì)先執(zhí)行最內(nèi)層的finally塊中的代碼,然后再執(zhí)行匹配異常的那個(gè)catch塊相關(guān)聯(lián)的finally塊。
|
finally |
一個(gè)try塊最多關(guān)聯(lián)一個(gè)finally塊。
Finally塊中的代碼應(yīng)該簡(jiǎn)短高效,只需要負(fù)責(zé)對(duì)try塊中的代碼發(fā)起的操作進(jìn)行清理。
世界末日?
如果catch塊或finally塊中拋出異常,這并不是世界末日!這樣的異常不會(huì)由我們的代碼來(lái)處理,最終會(huì)變成一個(gè)未處理的異常,然后clr會(huì)終止你的進(jìn)程。
浙公網(wǎng)安備 33010602011771號(hào)