摘要:本文主要探討了VB.NET中錯誤與異常的概念,結合Error對象和Exception對象的使用描述常用的異常處理技術,并結合VB.NET程序代碼對非結構化和結構化異常處理進行比較總結。
關鍵詞:VB.NET;程序錯誤與異常;異常處理技術
1. 錯誤與異常概述
在使用VB.NET開發程序軟件的過程中,隨著程序代碼的增長,在程序中不可避免地會產生一些錯誤,這些錯誤一般可以分為三類:語法錯誤、邏輯錯誤和運行時錯誤。
(1)語法錯誤:這類錯誤最容易發現,VS.NET會在包含錯誤的代碼下面使用波浪線標志錯誤,提示程序員語法錯誤發生的地點,并給出錯誤原因的相關信息,而且錯誤信息會在“任務列表”窗口中顯示出來。
(2)邏輯錯誤:這類錯誤是指程序運行正常但產生的結果卻和預期的不一樣。這類錯誤往往是由于程序員的邏輯思維混淆所導致的。
(3)運行時錯誤:這類錯誤往往是程序試圖執行的操作由于某些原因不可能被執行,例如當用戶試圖去打開一個不存在的文件,或者試圖去將一個字符類型的數據輸入到數據庫中一個非字符類型的字段中。
上述錯誤是指在程序執行代碼過程中發生的事件,在NET框架中錯誤的產生將中斷程序代碼的正常流程,并創建一個異常對象來表示這個錯誤。當錯誤中斷程序流程時,該程序將嘗試尋找異常處理程序(一段告訴程序如何對錯誤做出響應的代碼),以幫助程序恢復流程。從這里可以看出:錯誤是一個事件,而異常是該事件創建的對象;在異常產生時,異常處理程序能捕獲異常并進行相應的操作,以增加程序運行的穩定性和可靠性。
在VB.NET中有兩種異常處理技術:第一種是非結構化異常處理技術,它是早期VB版本中的異常處理技術,在非結構化異常處理中,代碼開始處的On Error 語句將處理所有的異常。第二種是結構化異常處理技術,類似于C#中的異常處理方式,它使用包含異常、單獨的代碼塊和篩選器的控制結構創建異常處理機制。它使代碼可以區分不同的錯誤類別,并根據相應的情況做出響應。與非結構化異常處理技術相比,結構化異常處理技術更強大,更具普遍性和靈活性。
2. 異常處理的方法
(1)非結構化異常處理。非結構化異常處理主要通過Err對象和以下語句來實現:On Error、Resume 和Err對象。On Error 語句用于創建單個異常處理程序以捕捉發生的所有異常,但一次只能有一個處理程序。此方法可以跟蹤最近產生的異常和最近的異常處理程序的位置。在On Error開始時,Err對象被設置為Nothing。在程序運行過程中產生錯誤時Err對象被賦值,如果有多個錯誤產生,Err對象屬性的值僅由剛剛發生的錯誤決定。每次在錯誤處理例程中發生Exit Sub、Exit Function、Exit Property、Resume 或Resume Next 語句時,Err 對象的屬性都將重置為零或零長度字符串。而在錯誤處理例程外部使用上述任何語句都不會重置其屬性。如果確實需要重置屬性,可以使用Clear方法重置Err對象。
(2)結構化異常處理。在VB.NET中使用Try、Catch、Finally關鍵字提供結構化異常處理功能。在Try代碼塊中包含可能產生異常的代碼段,它還可以和一個或多個Catch子句配合使用。這些Catch子句主要用來過濾異常并將它們和對應異常處理代碼建立關聯。最后無論在Try代碼塊中是否發生異常,Finally 語句所包含的代碼始終會被執行,即使在Exit Try語句后也會執行Finally語句。Finally語句塊通常執行清除任務,例如文件的關閉或解除對數據庫中表的鎖定等。
Catch子句可以采用三種格式:Catch、Catch...As 和Catch...When。Catch...As 和Catch...When 子句用于捕獲特定的異常,并在后面的語句塊中進行異常處理。VB.NET按照Catch...As(When)子句的順序把當前捕獲的異常類型和Catch...As(When)子句中列出的所有異常逐一進行比較,直到找到一個相匹配的。如果在所有的Catch...As(When)子句中沒有找到匹配的異常類型,最后將執行不包含as(When)的Catch子句。也就是說最后這個Catch子句可以捕獲所有的異常。需要注意的是:當使用多個Catch...As(When)子句捕獲異常時,所有的Catch...As(When)子句都是按出現的先后順序依次進行匹配,所以應該根據異常對象的層次結構,將低級別的異常放在Catch...As(When)子句的最前面,然后才是通用的異常,最后是不包含as(When)的Catch子句。
(3)創建自定義的異常。在VB.NET中可以通過從Application.Exception類中繼承,來創建自己的應用程序異常類。建議異常類的名稱以Exception結尾。
3. 非結構化和結構化異常處理技術對比
在使用非結構化異常技術處理異常時,可能產生程序代碼執行的跳轉,而且在非結構化異常處理中使用Err對象僅能獲得最近產生的錯誤信息,但代碼在執行過程中可能不只產生一處錯誤,從而使得已經發生的錯誤信息丟失。結構化異常處理技術采用Try...Catch...Finally控制結構作為結構化異常處理的基本結構,在處理異常時不會產生跳轉。而且可以根據所產生的異常類型的不同分別做出不同的處理。通常情況下,結構化異常處理技術提供了能夠更加靈活地處理錯誤的功能,在實際中得到廣泛應用。但在少數情況下仍然可能需要使用非結構化異常處理。
從上述對結構化和非結構化異常處理技術的描述,可以看出,結構化異常處理的功能比非結構化異常處理的功能更強大。需要注意的是由于拋出和捕獲異常會增加應用程序的負荷,因此,在確保異常得到處理的同時,不要過多地列舉異常,否則會導致程序性能下降。另外當可以肯定地知道代碼在此處會出現什么錯誤時可以使用if...else...進行處理。例如:檢測用戶輸入數據的類型等。在不能確定程序代碼會在什么位置出現什么類型的錯誤時,使用Try...Catch可以對錯誤進行有效地處理,提高程序的健壯性。例如:I/O操作等。
參考文獻:
[1] Microsoft.VB.NET程序設計語言【M】.高等教育出版社,2003.
[2] Fred Barwell VB.NET高級編程.清華大學出版社,2002.