Vba Ms Word嵌套错误控制

Vba Ms Word嵌套错误控制,vba,error-handling,ms-word,Vba,Error Handling,Ms Word,这次我试图处理嵌套sub之间的错误。例如: 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"

这次我试图处理嵌套sub之间的错误。例如:

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


请提前多谢

关于错误转到[错误处理程序标签]
告诉VBA在方法中发生运行时错误时跳转到指定的标签。当您使用错误处理程序时,您告诉VBA“一切都很好,不需要破坏一切,我可以处理它”。因此,当
Sub D
运行时:

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

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

Err.Raise Err.Number 'per Err.Raise specs, current Err values are reused when only the Number parameter is specified
…或者您删除子D中的处理程序,并决定在调用堆栈的更高层处理它。例如,如果除去
Sub A
中的所有处理程序,则会看到“A中的错误”,错误消息实际上是在
Sub D
中引发的错误的消息-不幸的是,没有任何方法告诉该错误发生在调用堆栈中的何处,因为VBA没有公开其调用堆栈

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

  • D中的错误
  • B中的错误
  • 错误
  • [如果你是在A公司长大的,那么如果A是你的起点,那么VBA就会在这里爆炸]

无论是否存在错误,您的错误处理程序都在运行。你能试着让代码更现实一点,只是为了提出一个明确的问题吗?专业提示:你在问题上付出的努力越多,你就越有可能以同样的努力得到答案。哦,对不起,在所有“做事情”中,你可能会认为有一个“退出子”。很抱歉给您带来不便为什么会出现溢出错误?P.D.:我的第一条评论:“()()()())@RubénPS我把它放进去只是为了说明OP打算在
Sub D
中把事情搞砸。抱歉,如果它把事情搞得一团糟,请随意拿出来。不是我的帖子,我只想知道它为什么在那里^-^所以…我需要做的是这个
Sub D()关于错误goto errormsg…..errormsg:Msgbox“blablabla”Err.Raise Err.Number end Sub
@Mat's Mug但如果这样做,它不会在离开D之前不经处理就返回相同的错误吗?@RubénPS取决于知道错误起源于D有多重要,但是是的,这就是为什么我提到删除处理程序并捕获A中的所有内容。
Err.Raise Err.Number 'per Err.Raise specs, current Err values are reused when only the Number parameter is specified