執行時錯誤 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
被認為是顯式跳轉 )。