Vba Ms-Word嵌套错误控制

Vba Ms-Word Nested Error Control

这次我正在尝试处理嵌套子之间的错误。例如:

Sub A()
    On Error GoTo errormsg

    Call B
    Call C
    Exit Sub
errormsg:
    MsgBox "Error in A", vbOKOnly, "Warning"
End Sub

Sub B()
    On Error GoTo errormsg

    Call D
    Exit Sub
errormsg:
    MsgBox "Error in B",vbOKOnly,"Warning"
End Sub

Sub C()
    On Error Goto errormsg

    '...

    Exit Sub
errormsg:
    MsgBox "Error in C",vbOKOnly,"Warning"
End Sub

Sub D()
    On Error GoTo errormsg  
    '...
    Err.Raise 6 'overflow error
    '...
    Exit Sub
errormsg:
    MsgBox "Error in D",vbOKOnly,"Warning"
End Sub

好吧,如果从 B(从 A)调用 D 时出错,会显示 ErrorD,但不会显示 ErrorB 和 ErrorA。我 doing/understanding 哪里错了?

非常感谢

On Error GoTo [error-handler-label] 告诉 VBA 每当方法中出现 运行time 错误时跳转到指定的标签。当您使用错误处理程序时,您是在告诉 VBA "it's all good, no need to blow everything up, I can handle it"。所以当 Sub D 运行s:

Sub D()
    On Error GoTo errormsg  
    '...
    Err.Raise 6 'overflow error
    '...
    Exit Sub
errormsg:
    MsgBox "Error in D",vbOKOnly,"Warning"
End Sub

当执行到抛出错误的行时,VBA 跳转到 errormsg 标签,您应该会看到 "Error in D" 消息。然后执行 returns 给调用者(Sub B),就 运行 时间而言,D 中引发的错误已得到处理(因为你告诉它 "I'll handle it" 和那个 On Error 语句),所以执行从 Exit Sub 语句和 returns 到 Sub A 到 运行 Sub C.

如果你想运行时间错误到"bubble up",你要么需要在错误处理子程序中重新提出它们:

Err.Raise Err.Number 'per Err.Raise specs, current Err values are reused when only the Number parameter is specified

...或者您删除 Sub D 中的处理程序并决定在调用堆栈中更高的位置处理它。例如,如果您删除 Sub A 中的所有处理程序 except,那么您将看到 "Error in A",错误消息实际上是在 Sub D - 不幸的是,没有任何方法可以告诉调用堆栈中发生错误的位置,因为 VBA 没有公开其调用堆栈。

在每个错误处理程序中重新引发错误应该按顺序弹出以下消息:

  • D 出错
  • B 出错
  • A 出错
  • [如果你在 A 再次加注,那么如果 A 是你的起点,VBA 会在此处爆掉]