【问题标题】:Why do some VBA errors not trigger error handling?为什么某些 VBA 错误不会触发错误处理?
【发布时间】:2012-07-26 02:15:09
【问题描述】:

今天早上更新我的代码时,我导致了一个错误 - 我用字符串替换了一个函数,但忘记取出后面的括号,导致代码无法运行。

但是,这并没有触发我的错误处理代码,所以它没有报告错误,我花了很长时间才通过单步执行代码找到它。

代码如下:

Private Sub Form_Close()

On Error GoTo ErrHandler

'Update to say the user is no longer logged in

        DoCmd.SetWarnings False
        DoCmd.OpenQuery "Last Logged Out"

'Backup data
If (strNameChecker <> "workshop.accdb") Then

        strBackupUser = Nz(GetFullName(), "default")
        strFriendlyNow = Replace(Now(), "/", "-")
        strFriendlyNow = Replace(strFriendlyNow, ":", "-")
        strNewFileName = "F:\Data\Central\Marketing\Databases\Prospects Database\Auto-Backups\TargetDBData - backed up by " & strBackupUser() & " on " & strFriendlyNow & ".mdb"
        BackupProspects "F:\Data\Central\Marketing\Databases\Prospects Database\TargetDBData.mdb", "" & strNewFileName & ""
        sSql = "INSERT INTO [Backup to Delete] ([Version Number]) SELECT '" & strNewFileName & "' AS Expr1;"
        DoCmd.RunSQL sSql


'Delete the temporary version of the front end.
        DoCmd.OpenQuery "Update - Version Shutdown"
        DoCmd.SetWarnings True
        Application.FollowHyperlink "F:\Data\Central\Marketing\Databases\Prospects Database\Prospects Database Shutdown.accdb"

End If

Exit Sub

ErrHandler:
DoCmd.SetWarnings True
MsgBox "The database has generated an error. Please contact the database administrator, quoting the following error message: '" & Err.Description & "'", vbCritical, "Database Error"

End Sub

错误是由 strBackupUser 后面的两个括号引起的,大约在代码的一半 - 删除它们,代码可以正常工作 - 但是为什么这个错误不会触发错误处理?

【问题讨论】:

  • 我使用 On Error Goto ErrHandler 进行错误处理,顺便说一句,子程序的第一行。
  • @JMK - 已发布 - 我发布的版本是导致错误的版本,请取出 strBackupUser 后面的括号以使其正常工作。
  • @HansUp 从不关闭警告?这不是很实用。我真的不希望我的用户每次运行添加或删除的查询时都必须确定。有时您必须关闭警告才能获得无缝的用户体验。
  • 嗨@HansUp - 尽管如此,我认为这归结为编码风格的偏好,就像你所有的其他 cmets 一样,它们都不会导致错误或阻止错误代码工作。不过还是谢谢。

标签: vba ms-access error-handling


【解决方案1】:

您的模块顶部似乎没有Option Explicit。结果,所有字符串变量都将被静默声明为Variant。我不确定编译器会如何处理表达式strBackupUser(),我猜它会尝试某种可怕的后期绑定对象或数组访问。

我建议你先添加Option Explicit,然后将所有变量显式声明为字符串,然后查看是否出现编译错误。

这是一个有用的"war story",它说明了如何以及为什么要使用它。

【讨论】:

    猜你喜欢
    • 2013-05-18
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多