获取更有用/更准确的错误消息

时间:2018-10-17 07:46:37

标签: vba ms-access access-vba

我们的Access前端有一个问题,该问题看似随机,但不断使用户超时,没有任何解释。这是一个长期存在的问题,每次断开连接时,都会为您提供引起问题的子程序和一般错误消息。

我开始认为错误消息具有误导性,它给出了错误代码为0的通用“连接失败”。在对代码进行谷歌搜索之后,这显然意味着没有错误发生?

我使用C#而不是VBA,所以我对它不熟悉,但是错误处理如下:

    Private Sub Form_Timer()

    Dim blnSystemMaintenance As Boolean

    On Error GoTo ErrHand

    ' Check for System Maintenance.
    blnSystemMaintenance = DLookup("SystemMaintenance", "ConfigItems")
    If blnSystemMaintenance Then

    //Do stuff
        Else
    //Do stuff
        End If

    //Do stuff

    End If

    ErrExit:
        Exit Sub
        Resume
    ErrHand:
    '    If Err.Number = 1 Then

    '    Else
            MsgBox "Error number: " & Err.Number & vbCrLf & _
           "Error description: " & Err.Description, vbCritical, _
           "Unexpected Error Occurred in Sub: Form_Timer"
    Resume ErrExit
    '    End If


    End Sub

有没有办法获得更有用的错误消息?

2 个答案:

答案 0 :(得分:1)

域聚合通常不提供描述性错误消息。我假设您的数据库在运行域聚合时遇到连接后端的问题。

您可以轻松地用记录集调用替换您的域集合:

blnSystemMaintenance = CurrentDb.OpenRecordset("SELECT SystemMaintenance FROM ConfigItems")(0).Value

通常,如果使用记录集时完全发生错误,则这些错误会给出更多的描述性错误。

答案 1 :(得分:1)

有时错误消息可能会误导某些类型的函数,例如DLookup,这是系统问题,但有时错误消息会引起误解,因为并非所有过程都具有正确的错误处理程序,并且很难定位问题,特别是在以下情况下:开发人员无法直接访问该应用程序。因此,正确的错误处理程序可能会大大简化故障排除过程。

通常,我使用两种类型的错误处理程序,这些错误处理程序可以使我获得非常清晰的诊断消息。最常见的-过程的常规错误处理程序,可以与用户交互并通常由系统调用-事件处理程序:

Private Sub Frame2_Click()
    On Error GoTo ErrorHandler
    'code here
ExitHere:
    On Error Resume Next
    Exit Sub
    Resume '>> remove in release
ErrorHandler:
    MsgBox "Error " & err.Number & " (" & err.Description & "), Line " & Erl & " in procedure Frame2_Click of Form_Form1", vbExclamation + vbMsgBoxHelpButton, "Error " & Now()
    Resume ExitHere
End Sub

第二种类型的处理程序-对于过程,只能由其他VBA过程调用的“冒泡”处理程序,它将有关错误的信息添加到错误描述中,并将错误传递给调用者过程:

Sub MySub()
    On Error GoTo ErrorHandler
    'code here
ExitHere:
    Exit Sub
    Resume '>> remove in release
ErrorHandler:
    Debug.Assert Not (STOP_AT_ERROR And IS_DEV) '>> remove in release
    err.Raise err.Number, "MySub of Form_Form1", err.Description & vbCrLf & "in MySub of Form_Form1 at " & Erl
End Sub

它允许显示完整的调用堆栈以及错误行和过程名称。行号应添加到每行代码中。

为了简化调试,我使用了两个常量:如果STOP_AT_ERRORTrue,而IS_DEVTrue,则在错误发生后立即停止代码执行,而不会冒泡并允许检查变量。为了进行检查,我使用Ctrl-F9将代码执行指针移至Resume行,然后按F8键,代码指针移至该行,从而导致错误。

在正式版或质量检查版中,只需将IS_DEV更改为False,代码就不会在Debug.Assert行处停止。

为自动生成错误处理程序并添加行号,我使用了第三方软件,例如MZ-Tools。可以手动完成,但是很费时间