VBA錯誤處理


在(VBScript/VBA)程式設計中有三種型別的錯誤:

  • 語法錯誤
  • 執行時錯誤
  • 邏輯錯誤

語法錯誤

語法錯誤(也稱為解析錯誤)發生在VBScript的解釋時間。 例如,下面一行導致語法錯誤,因為它缺少一個右括號。

Function ErrorHanlding_Demo()
   dim x,y
   x = "Yiibai Yiibai"
   y = Ucase(x
End Function

執行時錯誤

執行時錯誤(也稱為異常)在執行期間發生,在解釋之後。

例如,下面的行會導致執行時錯誤,因為這裡的語法是正確的,但是在執行時它正在嘗試呼叫fnmultiply,但這是一個不存在的函式。

Function ErrorHanlding_Demo1()
   Dim x,y
   x = 10
   y = 20
   z = fnadd(x,y)
   a = fnmultiply(x,y)
End Function

Function fnadd(x,y)
   fnadd = x + y
End Function

邏輯錯誤

邏輯錯誤可能是最難追查的錯誤型別。這些錯誤不是語法或執行時錯誤的結果。 相反,當您在驅動指令碼的邏輯中犯了一個錯誤,並且沒有得到預期的結果時,就會發生這種情況。

你可能無法捕捉到這些錯誤,因為這取決於業務需求,在程式中加入什麼型別的邏輯。

例如,將一個數位除以零,或寫入一個進入無限迴圈的指令碼。

Error物件

假設我們有一個執行時錯誤,那麼通過顯示錯誤資訊來停止執行。作為開發人員,如果想捕獲錯誤,那麼使用Error物件。

例子

在下面的例子中,Err.Number給出錯誤號,Err.Description給出錯誤描述。

Err.Raise 6   ' Raise an overflow error.
MsgBox "Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear   ' Clear the error.

錯誤處理

VBA啟用錯誤處理例程,也可以用來禁用錯誤處理例程。沒有On Error語句,發生的任何執行時錯誤都是致命的:顯示錯誤訊息,並且執行突然停止。

On Error { GoTo [ line | 0 | -1 ] | Resume Next }
編號 關鍵字 描述
1 GoTo line 啟用在所需的行引數中指定的行開始的錯誤處理例程。指定的行必須與On Error語句在相同的過程中,否則將發生編譯時錯誤。
2 GoTo 0 禁用當前過程中啟用的錯誤處理程式並將其重置為Nothing
3 GoTo -1 禁用當前過程中啟用的異常並將其重置為Nothing
4 Resume Next 指定發生執行時錯誤時,控制權轉到發生錯誤的語句之後的語句,並從該點繼續執行。

例子

Public Sub OnErrorDemo()
   On Error GoTo ErrorHandler   ' Enable error-handling routine.
   Dim x, y, z As Integer
   x = 50
   y = 0
   z = x / y   ' Divide by ZERO Error Raises

   ErrorHandler:    ' Error-handling routine.
   Select Case Err.Number   ' Evaluate error number.
      Case 10   ' Divide by zero error
         MsgBox ("You attempted to divide by zero!")
      Case Else
         MsgBox "UNKNOWN ERROR  - Error# " & Err.Number & " : " & Err.Description
   End Select
   Resume Next
End Sub