如何通过Err.Raise错误堆栈

假设Proc1调用Proc2,它调用Proc3。

在Proc3中,我用Err.Raise生成一个错误并处理错误。 到目前为止这么好,但是现在我退出Proc3并将控制传递给Proc2,Proc3由于Proc3中的错误应该分支到清理和退出。 但是,Proc2不知道Proc3中发生了什么错误,所以反而正常进行。 和Proc1一样。

什么是处理这个问题的好方法? 所有我能想到的是检查Proc3的error handling程序中的每个可能的Err.Raise错误,并再次提出相同的错误。 然后在Proc2中做同样的事情。 但是这似乎并不奏效,反正好像还有更好的办法。

通常,如果启用了error handling,则代码将立即跳转到启用error handling的方法中的下一行。 因此,当您在调用堆栈中的较高级别启用error handling时,这意味着您的代码将立即跳转到调用堆栈中启用了error handling的最低方法的方法调用之后。

例如(假定这个答案中的所有代码都是以调用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 

这将显示“1”,“2”,“3”,然后是“6”,因为它在Proc3遇到的错误。 如果错误不存在,则显示“1”,“2”,“3”,“4”,“5”,“6”。

现在,您可以在调用堆栈中的较低级别单独启用error handling。 例如,如果我添加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发生了error handling,并在下一行继续执行。