我们的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
有没有办法获得更有用的错误消息?
答案 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_ERROR
为True
,而IS_DEV
为True
,则在错误发生后立即停止代码执行,而不会冒泡并允许检查变量。为了进行检查,我使用Ctrl-F9将代码执行指针移至Resume
行,然后按F8键,代码指针移至该行,从而导致错误。
在正式版或质量检查版中,只需将IS_DEV
更改为False
,代码就不会在Debug.Assert
行处停止。
为自动生成错误处理程序并添加行号,我使用了第三方软件,例如MZ-Tools。可以手动完成,但是很费时间