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