恢復關鍵字

錯誤處理子例程將:

  • 執行到過程結束,在這種情況下,執行將在呼叫過程中重新開始。
  • 或者,使用 Resume 關鍵字在同一過程中恢復執行。

Resume 關鍵字只能在錯誤處理子例程中使用,因為如果 VBA 遇到 Resume 而沒有處於錯誤狀態,則會引發執行時錯誤 20無錯誤恢復

錯誤處理子例程可以通過多種方式使用 Resume 關鍵字:

  • Resume 單獨使用,在導致錯誤的語句上繼續執行。如果在執行此操作之前未實際處理錯誤,則將再次引發相同的錯誤,並且執行可能會進入無限迴圈。
  • Resume Next 導致錯誤的語句之後立即繼續執行語句。如果在執行此操作之前未實際處理錯誤,則允許執行繼續使用可能無效的資料,這可能導致邏輯錯誤和意外行為。
  • Resume [line label] 繼續在指定的行標籤 (或行號,如果你使用傳統樣式的行號)執行。這通常允許在乾淨地退出過程之前執行一些清理程式碼,例如確保在返回到呼叫者之前關閉資料庫連線。

On Error Resume Next

On Error 語句本身可以使用 Resume 關鍵字指示 VBA 執行時有效地忽略所有錯誤

如果在執行此操作之前未實際處理錯誤,則允許執行繼續使用可能無效的資料,這可能導致邏輯錯誤和意外行為

上面的重點不夠強調。 On Error Resume Next 有效地忽略所有錯誤並將它們推到地毯下。一個程式在給定無效輸入的情況下因執行時錯誤而爆炸是比使用未知/非預期資料執行的程式更好的程式 - 只是因為錯誤更容易識別。On Error Resume Next 可以輕鬆隱藏錯誤

On Error 語句是過程範圍的 - 這就是為什麼在給定的過程中通常只應該有一個這樣的 On Error 語句。

但是,有時候錯誤條件不能完全避免,並且跳轉到錯誤處理子程式只對 Resume Next 感覺不對。在這種特定情況下,已知可能失敗的語句可以包含在兩個 On Error 語句之間:

On Error Resume Next
[possibly-failing statement]
Err.Clear 'resets current error
On Error GoTo 0

On Error GoTo 0 指令在當前過程中重置錯誤處理,這樣導致執行時錯誤的任何進一步指令將在該過程中未處理,而是傳遞呼叫堆疊,直到它被活動錯誤處理程式捕獲。如果呼叫堆疊中沒有活動的錯誤處理程式,則將其視為未處理的異常。

Public Sub Caller()
    On Error GoTo Handler
    
    Callee
    
    Exit Sub
Handler:
    Debug.Print "Error " & Err.Number & " in Caller."
End Sub

Public Sub Callee()
    On Error GoTo Handler
    
    Err.Raise 1     'This will be handled by the Callee handler.
    On Error GoTo 0 'After this statement, errors are passed up the stack.
    Err.Raise 2     'This will be handled by the Caller handler.    
    
    Exit Sub
Handler:
    Debug.Print "Error " & Err.Number & " in Callee."
    Resume Next
End Sub