vba - 高级和低级过程之间的错误处理

标签 vba error-handling calling-convention

我遇到了一个较低级别的 UDF 将错误踢到最高级别子例程的错误处理的问题。我想我可以用 On Error GoTo -1 来解决这个问题,但问题仍然存在。

根据微软的说法,“如果没有 On Error GoTo -1 语句,则在退出过程时会自动禁用异常”( https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/on-error-statement )。这是否意味着当我调用较低级别的子例程时,我正在“退出”一个过程并取消 On Error GoTo -1陈述?

例如,这是一个子程序,它获取一个 excel 文档并将其与 jpg 图像组合成一个 pdf。 jpg 图像需要按文件名结尾的数字排序(即 Photomics0)。有时,文件名的末尾没有数字。我希望这会导致应该发生的正常错误。

最高级别的子程序具有以下错误处理:

Sub Example()

Do While t = 1

On Error GoTo errorMSG1
Set wb2 = Workbooks(Copyrange)
On Error GoTo -1
'
' more code here & call to other subroutines
'
Exit Sub

Loop

errorMSG1:
    On Error GoTo -1
'
' Code that notifies user that they don't have the excel document open in 
' background and opens it for them
'
End Sub

最低级别的 UDF(向下 3 级)遇到代码错误:
retvalint = CLng(retval)

由于 retval应该是 jpg 文件名末尾的数字。没有号码retval为空并引发错误,导致代码跳转到 errorMSG1 ,我不希望它这样做。

我还应该说,当我试图捕获的原始错误没有发生时,总是会发生这种情况。我还没有测试过当原始错误确实发生时是否会发生这种情况。

我试过扔On Error GoTo -1在我的子程序和函数的各个级别中绝对无处不在,但无济于事。

另外,顺便说一句,这是让错误“冒泡”的例子吗?

编辑:
我还应该说我之前尝试过使用 On Error GoTo 0 ,但更高级别的子有一个大的Do Loop在里面。我注意到,当我试图捕获的原始错误发生在 >=2 迭代时,它会吐出原始的 Runtime Error错误。

最佳答案

我不理解这方面的文档,但我从测试中弄清楚了。
On Error GoTo 0停止使用当前的错误处理程序。On Error GoTo -1清除当前错误。

这是一个例子:

Sub OnErrorTest()
    On Error GoTo myErrHnd
        Err.Raise 42
        myErrorSub
    On Error GoTo 0
        Err.Raise 44
    Exit Sub

myErrHnd:
    Debug.Print ("Error: " & Err.Number)
    Debug.Print ("Description: " & Err.Description & vbNewLine)
    Resume Next
End Sub

Sub myErrorSub()
    On Error GoTo myOtherErrHnd
    Workbooks("").Close
    Exit Sub

myOtherErrHnd:
    On Error GoTo -1 ' aka Err.Clear
End Sub

因此,要解决您遇到的问题,您似乎需要在设置工作簿后切换到 On Error GoTo 0。通常,如果在它们的任何父函数中设置了错误处理程序,错误就会冒泡。

关于vba - 高级和低级过程之间的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58468061/

相关文章:

VBA 使用数组值作为单元格验证值

c++ - 什么样的 C++ 函数可以放在 C 函数指针中?

Char 与 int 调用约定

assembly - 如何在汇编器 x86 函数调用中传递参数?

php - 如何在 laravel 4.2 中启用错误报告以进行调试

php - 在页面底部处理和显示 PHP 错误

excel - VBA 中 Range() 的 .Value 属性

excel - 使用错误处理根据列表框值删除工作表

excel - 使用 VBA 使用名称作为日期对 Excel 中的工作表进行排序

error-handling - Quartz.net Job未处理的异常行为