Vba Ms-Word嵌套错误控件

时间:2015-06-03 15:07:47

标签: vba error-handling ms-word

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

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。我在做什么/理解错误?

提前多多感谢

1 个答案:

答案 0 :(得分:2)

On Error GoTo [error-handler-label]告诉VBA在方法中发生运行时错误时跳转到指定的标签。当你使用错误处理程序时,你告诉VBA“这一切都很好,不需要把所有东西搞砸,我可以处理它”。所以当Sub D运行时:

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

当执行到达抛出错误的行时,VBA跳转到errormsg标签,您应该看到“D中的错误”消息。然后执行返回到调用者(Sub B),就运行时而言,D中引发的错误得到了处理(因为你告诉它“我会用它处理它”{{ 1}}语句),因此执行将继续使用On Error语句并返回Exit Sub以运行Sub A

如果您希望运行时错误“冒泡”,您需要在错误处理子例程中重新提升它们:

Sub C

...或者你删除了Err.Raise Err.Number 'per Err.Raise specs, current Err values are reused when only the Number parameter is specified 中的处理程序并决定在调用堆栈中将其处理得更高。例如,如果删除Sub D中除之外的所有处理程序,则会看到“A中的错误”,错误消息实际上是{{1}中引发的错误消息 - 遗憾的是,没有任何方法可以告诉调用堆栈中发生错误的位置,因为VBA不会暴露其调用堆栈。

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

  • D
  • 出错
  • B
  • 出错
  • A
  • 中的错误
  • [如果你在A中重新加注,那么如果A是你的起点,那么VBA会在这里爆炸]