C# 錯(cuò)誤處理 try...catch...finally
C#語言包含結(jié)構(gòu)化異常處理(Structured Exception Handling,SEH)的語法。用.3個(gè)關(guān)鍵字可以標(biāo)記出能處理異常的代碼和指令,如果發(fā)生異常,就使用這些指令處理異常。用于這個(gè)目的的3個(gè)關(guān)鍵字是try、catch和finally。它們都有一個(gè)關(guān)聯(lián)的代碼塊,必須在連續(xù)的代碼行中使用。其基本結(jié)構(gòu)如下:
try
{
…
}
catch (<exceptionType> e) when {filterlsTrue)
{
<await methodName(e);>
…
}
finally
{
<await methodName;>
…
}
也可在catch或finally塊內(nèi)使用C# 6中引入的await。await關(guān)鍵字用于支持先進(jìn)的異步編程技術(shù),避免瓶頸,且可以提高應(yīng)用程序的總體性能和響應(yīng)能力。
也可以只有try塊和finally塊,而沒有catch塊,或者有一個(gè)try塊和多個(gè)catch塊。如果有一個(gè)或多個(gè)catch塊,finally塊就是可選的,否則就是必需的。這些代碼塊的用法如下:
?try—包含拋出異常的代碼(在談到異常時(shí),C#語言用“拋出”這個(gè)術(shù)語表示“生成”或“導(dǎo)致”)。
?catch—包含拋出異常時(shí)要執(zhí)行的代碼。catch塊可使用<exceptionType>,設(shè)置為只響應(yīng)特定的異常類型(如System.IndexOutOfRangeException),以便提供多個(gè)catch塊。還可以完全省略這個(gè)參數(shù),讓通用的catch塊響應(yīng)所有異常。C# 6引入了一個(gè)概念“異常過濾”,通過在異常類型表達(dá)式后添加when關(guān)鍵字來實(shí)現(xiàn)。如果發(fā)生了該異常類型,且過濾表達(dá)式是true,就執(zhí)行catch塊中的代碼。
?finally—包含始終會(huì)執(zhí)行的代碼,如果沒有產(chǎn)生異常,則在try塊之后執(zhí)行,如果處理了異常,就在catch塊后執(zhí)行,或者在未處理的異常“上移到調(diào)用堆?!敝皥?zhí)行。“上移到調(diào)用堆?!北硎?,SEH允許嵌套try...catch...finally塊,可以直接嵌套,也可以在tty塊包含的函數(shù)調(diào)用中嵌套。例如,如果在被調(diào)用的函數(shù)中沒有catch塊能處理某個(gè)異常,就由調(diào)用代碼中的catch塊處理。如果始終沒有匹配的catch塊,就終止應(yīng)用程序。finally塊在此之前處理正是其存在的意義,否則也可在try...catch...finally 結(jié)構(gòu)的外部放置代碼。關(guān)于嵌套功能,后面還會(huì)進(jìn)一步討論,所以現(xiàn)在有些不明白也不必?fù)?dān)心。
在try塊的代碼中出現(xiàn)異常后,依次發(fā)生的事件如下,如下圖所示:
?try塊在發(fā)生異常的地方中斷程序的執(zhí)行。
?如果有catch塊,就檢查該塊是否匹配已拋出的異常類型。如果沒有catch塊,就執(zhí)行finally塊(如果沒有catch塊,就一定要有finally塊)。
?如果有catch塊,但它與已發(fā)生的異常類型不匹配,就檢查是否有其他catch塊。
?如果有catch塊匹配己發(fā)生的異常類型,且有一個(gè)異常過濾器是true,就執(zhí)行它包含的代碼,再執(zhí)行finally塊(如果有的話)。
?如果有catch塊匹配己發(fā)生的異常類型,但沒有異常過濾器,就執(zhí)行它包含的代碼,再執(zhí)行finally塊(如果有的話)。
?如果catch塊都不匹配己發(fā)生的異常類型,就執(zhí)行finally塊(如果有的話)
點(diǎn)擊加載更多評(píng)論>>