執行時錯誤 20 恢復沒有錯誤

不正確的程式碼

Sub DoSomething()
    On Error GoTo CleanFail
    DoSomethingElse

CleanFail:
    Debug.Print Err.Number
    Resume Next
End Sub

為什麼這不起作用?

如果 DoSomethingElse 程式引發錯誤,執行跳轉到 CleanFail 行標籤,列印錯誤號,Resume Next 指令跳回到緊跟錯誤發生線之後的指令,在這種情況下是 Debug.Print 指令:錯誤處理子程式在沒有錯誤上下文的情況下執行,當達到 Resume Next 指令時,會引發執行時錯誤 20,因為無處可去。

正確的程式碼

Sub DoSomething()
    On Error GoTo CleanFail
    DoSomethingElse

    Exit Sub    
CleanFail:
    Debug.Print Err.Number
    Resume Next
End Sub

為什麼這樣做?

通過在 CleanFail 行標籤之前引入 Exit Sub 指令,我們將 CleanFail 錯誤處理子程式與過程體的其餘部分隔離開來 - 執行錯誤處理子程式的唯一方法是通過 On Error 跳轉; 因此,沒有執行路徑到達錯誤上下文之外的 Resume 指令,這避免了執行時錯誤 20。

其他說明

這與執行時錯誤 3 非常相似 :沒有 GoSub 返回 ; 在這兩種情況下,解決方案是確保正常的執行路徑不能在沒有顯式跳轉的情況下進入子程式(由線標籤標識)(假設 On Error GoTo 被認為是顯式跳轉 )。