为啥错误处理程序触发时没有错误? [复制]

Posted

技术标签:

【中文标题】为啥错误处理程序触发时没有错误? [复制]【英文标题】:Why does error handler trigger with no error? [duplicate]为什么错误处理程序触发时没有错误? [复制] 【发布时间】:2019-09-18 21:01:03 【问题描述】:

单击按钮时,我正在运行一行代码来打开 PDF。我在那里放了一个错误处理程序,以防文件不存在。问题是代码有效并且文件已打开,但错误处理程序仍在运行。

当我禁用错误处理代码时,它运行良好并且 VB 不会产生错误。我什至尝试使用Err.Description 作为消息框,它只是弹出,没有显示任何内容。这是我的代码:

Private Sub cmdOpenPDF_Click()

On Error GoTo Errorhandler
 Application.FollowHyperlink "E:\groups\folder\folder2\" & Dir("E:\groups\folder\folder2\*" & Me.txtInvNum & "*")

Errorhandler:
        MsgBox "Unable to locate the file. I'm sorry this has happened.", vbOKOnly
  Exit Sub


End Sub

由于 PDF 打开没有问题,我希望没有错误。同样令人费解的是,在没有错误处理程序的情况下运行时没有错误。有谁知道它为什么这样做?

【问题讨论】:

Exit Sub移到Errorhandler:行之前。 【参考方案1】:

在您的代码中,Errorhandler 只是一个line label,On Error 语句在发生错误时将评估重定向到此标签。

因此,请考虑 VBA 不区分用于错误处理程序的行标签,或与任何其他 GoTo 语句一起使用的任何其他行标签,或未引用的行标签全部。

在没有错误的情况下,你的代码相当于:

Private Sub cmdOpenPDF_Click()
    Application.FollowHyperlink "E:\groups\folder\folder2\" & Dir("E:\groups\folder\folder2\*" & Me.txtInvNum & "*")

Errorhandler:
    MsgBox "Unable to locate the file. I'm sorry this has happened.", vbOKOnly
    Exit Sub
End Sub

在这里,VBA 将尽职尽责地执行FollowHyperlink 方法,然后是MsgBox 函数,最后是Exit Sub 语句。

为了避免每次都评估错误处理程序,错误处理程序的典型实现将在错误处理程序标签之前包含一个额外的标签,表示干净退出,例如:

Private Sub cmdOpenPDF_Click()
    On Error GoTo Errorhandler
    Application.FollowHyperlink "E:\groups\folder\folder2\" & Dir("E:\groups\folder\folder2\*" & Me.txtInvNum & "*")

ExitSub:
    Exit Sub

Errorhandler:
    MsgBox "Unable to locate the file. I'm sorry this has happened.", vbOKOnly
    Resume ExitSub
End Sub

这意味着在正常情况下,Exit Sub 语句将在评估 Errorhandler 标签后面的代码之前到达。

【讨论】:

感谢您的解释。我没有意识到以这种方式使用标签的细节。现在可以正常使用了。

以上是关于为啥错误处理程序触发时没有错误? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥调用未定义函数时没有 PHP 错误?

为啥 Rest Controller 会给出错误:“处理程序没有适配器”?

17)错误处理

异常处理

异常处理

异常处理