孫鯨鵬 南京技師學(xué)院
在日常生活中我們不可避免的會(huì)遇到各種意想不到的事情,同樣開發(fā)人員編寫的應(yīng)用程序代碼在運(yùn)行過程中,也會(huì)發(fā)生各種難以預(yù)料的問題。當(dāng)代碼不能對遇到的問題進(jìn)行處理時(shí),就會(huì)發(fā)生“異常(EXCEPTION)”,隨之而來的是程序發(fā)生報(bào)錯(cuò)、數(shù)據(jù)丟失甚至于系統(tǒng)崩潰等問題。如果缺乏對這些異常的處理可能會(huì)給用戶帶來巨大的損失,如何對這些不可預(yù)知的異常的進(jìn)行處理也成了開發(fā)人員的必備技能。本文以C#開發(fā)環(huán)境中的異常處理為例展開闡述與分析。
C#(C SHARP)是一款基于微軟.NET Framework框架的面向?qū)ο蟾呒?jí)編程語言。C#語言繼承并發(fā)揚(yáng)了VB語言的所見即所得的便利操作性和C++語言的高效率的特性,語法優(yōu)美規(guī)范、是.NET平臺(tái)開發(fā)的首選。盡管基于C#開發(fā)環(huán)境中的應(yīng)用程序穩(wěn)定性在不斷提高,但是由于客戶的使用環(huán)境與習(xí)慣千變?nèi)f化使得應(yīng)用程序的異常時(shí)有發(fā)生。C# 語言的異常處理功能可幫助開發(fā)人員處理應(yīng)用程序運(yùn)行時(shí)出現(xiàn)的任何意外或異常情況。異常處理利用try、catch和finally編寫相關(guān)代碼來實(shí)現(xiàn)某些邏輯,以處理異常情況。其次是在事后釋放資源時(shí),使用異常處理也有很大的幫助。
try塊包含的代碼通常需要執(zhí)行一些通用的資源釋放操作,或者需要從異常中恢復(fù),或者兩者都需要。釋放代碼應(yīng)放在一個(gè)finally塊中。try塊還可包含也許會(huì)拋出異常的代碼。異常恢復(fù)代碼應(yīng)放在一個(gè)或多個(gè)catch塊中。針對應(yīng)用程序能從中安全恢復(fù)的每一種異常,都應(yīng)該創(chuàng)建一個(gè)catch塊。一個(gè)try塊至少要有一個(gè)關(guān)聯(lián)的catch塊或finally塊,單獨(dú)一個(gè)try塊是沒有意義的,也是不合法的。
catch塊內(nèi)的代碼用以響應(yīng)異常并執(zhí)行相關(guān)的代碼。單個(gè)try塊可以關(guān)聯(lián)多個(gè)catch塊,也可以不關(guān)聯(lián)任何catch塊。如果try塊中的代碼執(zhí)行過程中未遇到異常,那么CLR將不會(huì)執(zhí)行它的任何catch塊中的代碼。線程將跳過所有catch塊,直接執(zhí)行finally塊中的代碼。finally塊中的代碼執(zhí)行完畢后,執(zhí)行從finally塊后面的語句繼續(xù)。
catch關(guān)鍵字后的圓括號(hào)中的表達(dá)式稱為捕捉類型。在C#中,必須將捕捉類型指定為System.Exception或者是其派生類型。
多數(shù)情況下,異常并不是由代碼的執(zhí)行報(bào)錯(cuò)拋出,而是由調(diào)用堆棧中底層的其它方法所引發(fā)。在這種情況下,將由CLR將負(fù)責(zé)查找堆棧內(nèi)是否由對應(yīng)此異常類型的catch塊,如果存在,則執(zhí)行該catch塊內(nèi)代碼。如果不存在對應(yīng)的catch塊,則終止該進(jìn)程,并將此消息提示給用戶。
finally塊包含的代碼是保證會(huì)執(zhí)行的代碼。通常為執(zhí)行的try塊中的操作所要求的資源釋放。finally 塊將在最后執(zhí)行,在 try 塊和任何匹配 catch 的塊之后執(zhí)行。 不管是否引發(fā)異?;蛘呤欠裾业脚c異常類型匹配的 catch 塊,finally 始終運(yùn)行。
finally 塊內(nèi)代碼多用于資源的釋放,而不用等待由CLR中的GC來完成對象的回收工作。
異常處理在軟件開發(fā)中的使用非常廣泛,其過程可以歸結(jié)為在異常發(fā)生前做好分類定義,發(fā)生后保護(hù)現(xiàn)場,處理異常,退出異常處理程序后,恢復(fù)被中斷程序的運(yùn)行。
C# 開發(fā)人員可使用 try 塊對可能受異常影響的代碼進(jìn)行分區(qū)。 關(guān)聯(lián)的 catch 塊用于處理任何結(jié)果異常。 一個(gè)包含代碼的finally 塊,無論 try 塊中是否引發(fā)異常(例如,釋放在 try 塊中分配的資源),這些代碼都會(huì)運(yùn)行。 一個(gè) try 塊需要一個(gè)或多個(gè)關(guān)聯(lián)的 catch 塊或一個(gè) finally 塊,或兩者。C# 語言的異常處理功能中的try-catch、try-finally和 try-catch-finally 三個(gè)語句可以靈活運(yùn)用,使用非常方便。
對于所有已知錯(cuò)誤引發(fā)的異常,開發(fā)人員可以通過采取一些措施允許應(yīng)用程序從異常中恢復(fù)并繼續(xù)運(yùn)行。示例代碼如下:
上述代碼計(jì)算兩個(gè)數(shù)相除的值,并將這個(gè)值通過字符串返回給調(diào)用函數(shù),若發(fā)生異常則由catch段代碼對result進(jìn)行賦值,給用戶合理的提示。如果除數(shù)b為0,那么CLR將拋出DivideByZeroExcep
tion異常,并向用戶返回“除數(shù)不能為零!”這個(gè)結(jié)果。如果被除數(shù)a為最大整數(shù),而除數(shù)為最小實(shí)數(shù),那么結(jié)果超出取值范圍CLR將拋出
OverflowException異常,并向用戶返回“數(shù)據(jù)溢出,無法顯示數(shù)據(jù)!”這個(gè)結(jié)果。這種做法極大的提升了用戶的體驗(yàn)性,同時(shí)也對開發(fā)人員對各種異常捕捉恢復(fù)提出了較高的要求。
總結(jié):任何技術(shù)高明的程序員所編寫的應(yīng)用程序都不可能絕對不出差錯(cuò)的運(yùn)行,如何使用異常處理來提高應(yīng)用程序的友好性、容錯(cuò)性及準(zhǔn)確的錯(cuò)誤信息收集能力是優(yōu)秀的應(yīng)用程序必須具備的特點(diǎn)。本文在分析了異常處理技術(shù)的概念和思想后,對異常處理進(jìn)行了總結(jié),并針對C#語言給出了相關(guān)示例,探討了對應(yīng)的解決措施,希望能對讀者在開發(fā)應(yīng)用程序時(shí)有所幫助。