位置:首頁 > 軟件操作教程 > 編程開發(fā) > C# > 問題詳情

C# 錯(cuò)誤處理 try...catch...finally

提問人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-04

    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ā)生的事件如下,如下圖所示:

image.png

    ?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塊(如果有的話)

繼續(xù)查找其他問題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部