为什么错误处理例程中的消息被打印两次?

时间:2019-06-29 01:21:52

标签: excel vba exception error-handling

我意识到应该在通过常规流程到达错误处理程序之前先退出sub,但是我测试了如果不执行该操作会发生什么,结果使我感到惊讶。

Sub error_test()


On Error GoTo errorhandler

Err.Raise (7)
MsgBox "one"

errorhandler:
MsgBox "two"
Resume Next

End Sub

打印“两个”,“一个”,“两个”,“两个”

为什么“两个”最后要打印两次?

2 个答案:

答案 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} }触发它。

https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/resume-without-error-error-20

如果您当前未处理错误,则不能使用Resume Next

答案 1 :(得分:1)

在错误处理程序之前,您应该有一个Exit Sub。

否则,它将运行,在加注后击中“ Two”,然后返回到进程中击中“ One”。

然后,它在正常执行时进入错误处理程序,并再次击中“ Two”。

之后,它尝试运行Resume命令,这是一个错误,因为它不在错误模式下。由于存在错误处理程序,因此进入错误处理程序并额外输出“ Two”。这次它可以恢复,并且位于过程的底部。