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 и соответствующих меток и констант, связанных с моей схемой обработки ошибок. Я также использую его для синхронизации констант с фактическими именами процедур (если имена функций должны измениться).