我意识到应该在通过常规流程到达错误处理程序之前先退出sub,但是我测试了如果不执行该操作会发生什么,结果使我感到惊讶。
Sub error_test()
On Error GoTo errorhandler
Err.Raise (7)
MsgBox "one"
errorhandler:
MsgBox "two"
Resume Next
End Sub
打印“两个”,“一个”,“两个”,“两个”
为什么“两个”最后要打印两次?
答案 0 :(得分:2)
这使它更清晰:
Sub error_test()
On Error GoTo errorhandler
Err.Raise (7)
Debug.Print "one"
errorhandler:
Debug.Print Err.Number, "two"
Resume Next
End Sub
输出:
7 two
one
0 two
20 two
它第一次进入错误处理块是因为Err.Raise
,第二次它刚好在MsgBox
调用之后进入,而第三次是{{1} }触发它。
如果您当前未处理错误,则不能使用Resume Next
。
答案 1 :(得分:1)
在错误处理程序之前,您应该有一个Exit Sub。
否则,它将运行,在加注后击中“ Two”,然后返回到进程中击中“ One”。
然后,它在正常执行时进入错误处理程序,并再次击中“ Two”。
之后,它尝试运行Resume命令,这是一个错误,因为它不在错误模式下。由于存在错误处理程序,因此进入错误处理程序并额外输出“ Two”。这次它可以恢复,并且位于过程的底部。