假设Proc1调用Proc2,后者又调用Proc3。
在Proc3中,我用Err.Raise生成一个错误并处理该错误。到目前为止一切顺利,但是现在我退出Proc3,并将控制权传递给Proc2,由于Proc3中的错误,该分支应分支到清理并退出。但是,Proc2不知道Proc3中发生了错误,因此可以正常进行。与Proc1相同。
有什么好的方法来解决这个问题?我所能想到的就是在Proc3的错误处理程序中检查每个可能的Err.Raise错误,然后再次引发相同的错误。然后在Proc2中进行相同的操作。但这似乎不起作用,而且似乎总有一种更好的方法。
最佳答案
通常,如果启用了错误处理,则代码将立即跳转到启用错误处理的方法中的下一行。这样,当您在调用堆栈中的较高级别启用了错误处理时,这意味着您的代码将立即跳转到启用了错误处理的调用堆栈中最底层方法中的方法调用之后。
例如(假设此答案中的所有代码均以对Proc1
的调用开头):
Sub Proc1()
On Error Resume Next
MsgBox 1
Proc2
MsgBox 6
End Sub
Sub Proc2()
MsgBox 2
Proc3
MsgBox 5
End Sub
Sub Proc3()
MsgBox 3
Dim x As Integer
x = CInt("x")
MsgBox 4
End Sub
由于在
Proc3
中遇到错误,因此将显示“1”,“2”,“3”,然后显示“6”。如果不存在该错误,则它当然会显示“1”,“2”,“3”,“4”,“5”,“6”。现在,您可以在调用堆栈的较低级别分别启用错误处理。例如,如果我将
On Error Resume Next
像这样添加到Proc2
:Sub Proc2()
On Error Resume Next
MsgBox 2
Proc3
MsgBox 5
End Sub
然后我的输出变为“1”,“2”,“3”,“5”,“6”。注意添加了“5”,因为现在错误处理发生在
Proc2
中,并在下一行继续。
关于vba - 如何将Err.Raise错误传递给堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28586924/