當一個程序運行出錯時,vb提供了缺省的錯誤處理可以提供給用戶出現錯誤的編號和對錯誤的一段簡短描述並自動終止應用程序。
舉例來說,如果把一個很大的計算結果保存到一個整型變量中,會導致溢出的運行錯。Visual Basic會給出下圖所示的出錯編號為6,原因為“溢出”的對話框。 由於Visual Basic不支持集中錯誤處理技術。每一個過程或事件都要求有一個錯誤處理程序來解決一個它自己的錯誤,所以我們必須自己編寫錯誤處理程序。
創建一個錯誤處理程序的三個基本步驟:
激活一個錯誤處理程序
編寫對可能發生的錯誤進行處理的代碼
繼續程序的運行
下面具體介紹一下詳細步驟:
一、通過激活錯誤處理程序來對運行錯進行處理。
在過程中使用On Error GoTo語句加一個命名的標號來激活錯誤處理程序。標號是用來指出錯誤發生時程序轉向錯誤處理程序的入口。(Identifies a point in code to which the execution will branch when an error is encountered)。這部分代碼稱為"錯誤處理程序",命名和變量的命名一樣,可以以冒號結尾。放在過程的Exit Sub語句之後。 下面的程序是DataErr錯誤處理程序實現對數據溢出錯誤的處理:
Private Sub Command1-Click()
On Error GoTo DataErr
Dim num As Integer, var As Integer
num=10
var = num * 10000
Print var
Exit Sub
DataErr:
MsgBox “超出了整數的范圍”
End Sub
二、使用Err對象
看過這個例子之後讓我們來看看咋樣使用Err對象:
Err對象能報告包含和運行錯相關的錯誤信息。可以幫助確定發生的錯誤類型、原因和錯誤發生的地方。Err的屬性是由錯誤發生者設置的。錯誤可能是由Visual Basic或是編程者產生的。在運行錯發生時,運行錯的屬性就被設置為能唯一標志這個錯誤的信息以及要求的處理。
1. Err對象的屬性
Number屬性
返回或設置標識錯誤的編號。它是Err對象的缺省屬性。它可以用來確定是哪一個錯誤發生了,它的值是錯誤的唯一標識。
語法格式:Object.Number
Description 屬性
返回或設置用來對錯誤進行描述的字符串。
語法格式:Object.Description
Source屬性
返回或設置產生錯誤的應用程序的名字的字符串。當一個意外錯誤發生時,這個值被自動設置。
語法格式:Object.Source
返回或設置一個包含指向幫助文件所在位置的路徑的字符串。
語法格式:Object.HelpFile
HelpContext屬性
返回或設置包含幫助文件中有關主題的上下文ID的字符串。
語法格式:Object.HelpContext
2. Err對象的方法
Clear方法
在錯誤處理後清除Err對象的所有屬性的值。使Resume語句或On Error語句之後或是結束一個子程序塊或一個函數過程之後都會自動調用這個方法。
語法格式:Object.Clear
Raise方法
這個方法用來產生一個錯誤。它是在測試和評估的時候使用的。這樣可以主動地產生錯誤,以便在程序其他地方的錯誤處理程序來對它進行處理。
語法格式:Object.Raise number,source,description,helpfile, helpcontext
除了number以外的所有參數都是可選的
請看下面的實例
Private Sub cmdError_Click
Dim num As Integer
num=Val(Text1.Text)
On Error GoTo NoErr
Err.Raise num
Exit Sub
NoErr:
Select case Err.Number
Case 6
MsgBox “溢出"
Text1.SetFocus
Case 11
MsgBox "0做除數"
Text1.SetFocus
Case else
MsgBox "不知道的錯誤類型"
Exit Sub
End select
Text1.Text=“ "
End Sub
三、用Resume語句來實現繼續運行程序。
三種Resume語句:
Resume語句
程序從產生錯誤的語句開始接著運行。
Resume Next語句
程序從產生錯誤的語句的下一條語句接著運行。
Resume line語句
從Resume line語句後指定的標號或是行號處開始運行程序,注意標號或是行號指定的語句必須和錯誤處理程序在同一個過程中。
在下面的例子中,使用到了上面提到的三種屬性來處理一個除數為零的錯誤。
Private Sub Result-Click()
On Error GoTo err1
Text3.Text = Text1.Text / Text2.Text
Msgbox “Error resolved”
Exit sub
err1:
MsgBox Err.Number
MsgBox Err.Description
MsgBox Err.Source
If Err. Number = 11 Then
Text2.Text = Text2.Text + 1
End If
Resume
End Sub
四、跟蹤錯誤
對程序中發生的錯誤進行捕獲。當執行一個標志著錯誤處理程序開始的On Error語句時就引發了對錯誤的跟蹤。當執行到Exit Sub、Exit Function、Exit Property、End Sub、End Function
或End Property語句時就意味著跟蹤的結束。可以使用On Error GoTo 0來結束對錯誤的跟蹤。
考慮用下面兩種跟蹤和處理錯誤的方法 :即時處理和延時處理
1、錯誤的即時處理
在程序錯誤一發生時就轉向錯誤處理程序並馬上進行處理。“On Error GoTo line"語句給出了錯誤處理程序的入口位置。錯誤處理程序一般以一個標號開始,這個標號也就是在On Error GoTo語句中使用到的標號。錯誤處理程序采取相應的動作來解決出現的錯誤並從出錯的語句或者出錯語句的下一條語句接著運行程序。需要一條語句在錯誤處理程序完成後結束這個過程(Exit Sub)。
2、錯誤的延時處理
這種方法中VB忽略發生的錯誤,但是代碼最後檢測到這個錯誤。用於象除數為零等這種錯誤。錯誤處理代碼用來重新設置變量的值,使得程序可以繼續執行下去。
缺點是在可能出錯的地方,都需要編寫錯誤處理代碼。Err對象在一個新的錯誤產生時不保存先前的錯誤信息。但是我們可以使用“On Error Resume Next"語句來激發這種錯誤處理方法。會讓Visual Basic在錯誤已經發生後繼續執行程序。
下面的例子就是先查看Err對象的Number屬性,如果該屬性的值大於0,則表明有多個錯誤發生了。
Private Sub Command1-Click()
On Error Resume Next
Text3.Text= Text1.Text / Text2.Text
If Err.Number > 0 Then
If Err.Number = 11 Then
Text3.Text = 0
Else
MsgBox “Input not valid"
Exit Sub
End If
End If
End Sub
“On Error Resume Next"語句標志在此使用的是延遲處理的方法。同時也調用了Clear方法來清除並設置Err對象的屬性,為下一個出現的錯誤做准備。