MS-Access, VBA и обработка ошибок
Это скорее наблюдение, чем реальный вопрос: MS-Access (и VBA в целом) отчаянно пропускает инструмент, в котором код обработки ошибок может генерироваться автоматически и где номер строки может отображаться при возникновении ошибки. Вы нашли решение? Что это? Я просто понял, сколько сотен часов я пощадил, так как нашел правильный ответ на эту основную проблему несколько лет назад, и я хотел бы посмотреть, каковы ваши идеи и решения по этой очень важной проблеме.
Ответы
Ответ 1
Мое решение следующее:
- установите MZ-Tools, очень интересное дополнение для VBA. Нет, они не платили мне, так или иначе, это бесплатно.
- запрограммируйте стандартный код обработчика ошибок, такой как этот (см. меню инструментов MZ/Параметры/Обработчик ошибок):
On Error GoTo {PROCEDURE_NAME}_Error
{PROCEDURE_BODY}
On Error GoTo 0
Exit {PROCEDURE_TYPE}
{PROCEDURE_NAME}_Error:
debug.print "#" & Err.Number, Err.description, "l#" & erl, "{PROCEDURE_NAME}", "{MODULE_NAME}"
Этот стандартный код ошибки может быть автоматически добавлен ко всем вашим процессам и функциям, щелкнув соответствующую кнопку в меню MZ-Tools. Вы заметите, что здесь мы ссылаемся на недокументированное значение/свойство VBA (выпуск 2003 года), "erl", что означает "строка ошибки". Ты понял! Если вы запросите MZ-Tools для автоматического номера ваших строк кода, тогда "erl" предоставит вам номер строки, в которой произошла ошибка. У вас будет полное описание ошибки в вашем ближайшем окне, например:
#91, Object variable or With block variable not set, l# 30, addNewField, Utilities
Конечно, как только вы осознаете интерес системы, вы можете подумать о более сложном обработчике ошибок, который не только отобразит данные в окне отладки, но и также:
- отобразить его как сообщение на экране
- Автоматически вставлять строку в файл журнала ошибок с описанием ошибки или
- Если вы работаете с Access или если вы подключены к базе данных, автоматически добавьте запись в таблицу Tbl_Error!
означает, что каждая ошибка, сгенерированная на уровне пользователя, может быть сохранена либо в файле, либо в таблице, где-то на машине или в сети. Мы говорим о создании автоматической системы отчетов об ошибках, работающей с VBA?
Ответ 2
Как насчет использования "Erl", он будет отображать последнюю метку перед ошибкой (например, 10, 20 или 30)?
Private Sub mySUB()
On Error GoTo Err_mySUB
10:
Dim stDocName As String
Dim stLinkCriteria As String
20:
stDocName = "MyDoc"
30:
DoCmd.openform stDocName, acFormDS, , stLinkCriteria
Exit_mySUB:
Exit Sub
Err_mySUB:
MsgBox Err.Number & ": " & Err.Description & " (" & Erl & ")"
Resume Exit_mySUB
End Sub
Ответ 3
Хорошо, есть несколько инструментов, которые будут делать то, что вы просите MZ Tools и FMS Inc приходят на ум.
В основном они включают добавление:
On Error GoTo ErrorHandler
в начало каждой процедуры
и в конце они помещают:
ErrorHandler:
Call MyErrorhandler Err.Number, Err.Description, Err.LineNumber
ярлык обычно вызывает глобальный обработчик ошибок, в котором вы можете отображать и регистрировать сообщения об ошибках
Ответ 4
Вы всегда можете свернуть свой собственный инструмент, например Chip Pearson. VBA может фактически получить доступ к своей собственной IDE с помощью Microsoft Visual Basic для расширяемости приложений 5.3. Библиотека. Я написал несколько модулей классов, которые облегчают работу с самим собой. Их можно найти в Обзор кода SE.
Я использую его для вставки операторов On Error GoTo ErrHandler
и соответствующих меток и констант, связанных с моей схемой обработки ошибок. Я также использую его для синхронизации констант с фактическими именами процедур (если имена функций должны измениться).