Иногда сообщения об ошибках могут вводить в заблуждение для некоторых типов функций, таких как 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
, выполнение кода прекращается сразу после ошибки без всплывающих окон и позволяет проверять переменные.Для проверки я перемещаю указатель выполнения кода в строку Resume
с помощью Ctrl-F9, затем нажимаю F8 и указатель кода перемещается в строку, что вызвало ошибку.
В рабочей или QA-версиях просто изменитеIS_DEV
до False
и код не остановится на строке Debug.Assert
.
Для автоматической генерации обработчиков ошибок и добавления номеров строк я использую стороннее программное обеспечение, например, MZ-Tools.Это можно сделать вручную, но это довольно много времени