我正在尝试这次来处理嵌套的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。我在做什么/理解错误?
提前多多感谢
答案 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不会暴露其调用堆栈。
重新引发每个错误处理程序中的错误应该按顺序弹出以下消息: