【问题标题】:Why does the message in the error handling routine get printed twice?为什么错误处理例程中的消息会打印两次?
【发布时间】:2019-11-10 20:36:30
【问题描述】:

我意识到 sub 应该在通过正常流程到达错误处理程序之前退出,但我测试了如果不这样做会发生什么,结果让我感到惊讶。

Sub error_test()


On Error GoTo errorhandler

Err.Raise (7)
MsgBox "one"

errorhandler:
MsgBox "two"
Resume Next

End Sub

打印“二”、“一”、“二”、“二”

为什么最后会打印两次?

【问题讨论】:

    标签: excel vba exception error-handling


    【解决方案1】:

    这样会更清楚一点:

    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调用之后立即落入其中,第三次是Resume Next触发它。

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

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

    【讨论】:

    • 这解释了为什么它在“one”打印后打印一次但不是两次。我期待它打印一次
    • 当我包含出口子时,它会打印“二”,“一”然后停止
    【解决方案2】:

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

    否则,它会运行,在加注后击中“Two”,然后返回 proc,击中“One”。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      相关资源
      最近更新 更多