如何将Err.Raise错误传递给堆栈

时间:2015-02-18 15:12:10

标签: excel vba excel-vba error-handling

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

在Proc3中,我使用Err.Raise生成错误并处理错误。到目前为止一切顺利,但现在我退出Proc3并控制传递给Proc2,由于Proc3中的错误应该分支到清理并退出。但是,Proc2不知道Proc3中发生了错误,因此它正常进行。与Proc1相同。

处理这个问题的好方法是什么?我能想到的只是在Proc3的错误处理程序中检查每个可能的Err.Raise错误,并在那里再次引发相同的错误。然后在Proc2中做同样的事情。但这似乎不起作用,似乎必须有更好的方法。

1 个答案:

答案 0 :(得分:3)

通常,如果启用了错误处理,您的代码将立即跳转到启用错误处理的方法的下一行。因此,当您在调用堆栈中的更高级别启用错误处理时,这意味着您的代码将立即跳转到调用堆栈中最低方法中的方法调用之后的位置错误处理已启用。

例如(假设此答案中的所有代码都以调用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”。

现在,您可以在调用堆栈的较低级别单独启用错误处理。例如,如果我将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并继续下一行。