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

标签 vba excel error-handling

假设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/

相关文章:

javascript - 将整个 javascript 库包装在 try catch block 中有哪些缺点?

django - 在 Django 测试中检查表单错误

asp.net-mvc - 使用CaSTLe Windsor的Dynamic Proxies实现ASP.NET MVC错误处理

excel - 在列中查找包含文本且在字符串的前 6 个字符中不包含特定单词的单元格

Excel VBA : Loop from largest value and check for conditions

java.lang.ClassNotFoundException : org. apache.poi.poifs.crypt.agile.AgileEncryptionInfoBuilder

excel - 检查excel 2010 vba中是否存在目录

vba - 使用 VBA 访问 Outlook 中的文件夹

vba - 获取幻灯片形状对应的布局形状

vba - 无法在我的抓取工具中设置超时选项以防止无限循环