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 会在此处爆掉]
这次我正在尝试处理嵌套子之间的错误。例如:
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 会在此处爆掉]