Обработка ошибок Перехват и обработка ошибок времени выполнения

          Назад



6.3 Перехват и обработка ошибок времени выполнения


Отладка и обнаружение ошибок в программах VBA, ошибки времени выполнение (runtime errors), обработка ошибок времени выполнения, команда On Error GoTo, объект Err

Самое тяжелые для разработчика ошибки — это ошибки времени выполнения, которые могут возникнуть по самым разным причинам: пользователь ввел недопустимое значение, файл с таким именем уже существует, сервер баз данных отказывается вставлять введенные пользователем данные, разорвано сетевое соединение и т.п. При возникновении ошибок времени выполнения обычно работа приложения аварийно завершается, а пользователю выдается встроенное сообщение, которое он вряд ли сможет расшифровать. Поэтому одна из самых трудоемких частей при создании программы на VBA — предусмотреть, какие ошибки могут возникнуть при работе пользователя и реализовать их обработку.

Общий принцип обработки ошибки выглядит так:

  • Перед опасным кодом (сохранение/открытие файла, возможность деления на ноль и т.п.) помещается команда On Error GoTo метка_обработчика_ошибки, например:

Dim a As Integer, b As Integer, c As Integer

On Error GoTo ErrorHandlerDivision

c = a / b

Далее в коде программы помещается метка обработчика ошибки и программный код обработки:

ErrorHandlerDivision:

MsgBox "Ошибка при делении"

Поскольку в такой ситуации код обработчика ошибки будет выполняться даже в том случае, если ошибки не было, есть смысл поставить перед меткой обработчика команду Exit Sub (если это подпроцедура) или Exit Function (если это — функция). Полный код нашей мини-программы может выглядеть так:

Private Sub UserForm_Click()

Dim a As Integer, b As Integer, c As Integer

On Error GoTo ErrorHandlerDivision

c = a / b

Exit Sub

ErrorHandlerDivision:

MsgBox "Ошибка при делении"

End Sub

Как правило, если есть возможность исправить ошибку — в обработчике ошибок ее исправляют (или предоставляют такую возможность пользователю), если нет — то выдают пользователю сообщение с объяснением и прекращают работу программы.

После выполнения кода обработчика ошибки вам нужно будет сделать выбор — либо продолжить выполнение той процедуры, в которой возникла ошибка, либо прекратить ее выполнение и передать управление вызвавшей ее процедуре. В вашем распоряжении три варианта:

  • еще раз выполнить оператор, вызвавший ошибку (если обработчик ошибки решает возникшие проблемы). Для этого достаточно в обработчик ошибок вставить команду Resume;
  • пропустить оператор, вызвавший ошибку. Для этой цели можно использовать команду Resume Next;
  • продолжить выполнение с определенного места в программе. Используется команда

Resume метка

Синтаксис работы с меткой — такой же, как в GoTo.

Еще несколько моментов, которые связаны с обработкой ошибок:

  • чтобы вернуться в нормальный режим работы после прохождения опасного участка кода (отменить обработку ошибок) можно воспользоваться командой

On Error GoTo 0

  • в вашем распоряжении имеется также команда On Error Resume Next. Она предписывает компилятору просто игнорировать все возникающие ошибки и переходить к выполнению следующего оператора. На практике очень часто перед выполнением опасного оператора просто дается On Error Resume Next, а затем при помощи конструкции Select…Case проверяется номер возникшей ошибки (через свойства объекта Err) и в зависимости от этого организуется дальнейшее выполнение программы.

Чуть подробнее о специальном объекте Err. У этого объекта — два главных свойства и два метода:

  • Number — это свойство показывает номер ошибки. Обычно оно и проверяется в обработчике ошибок, чтобы выяснить, какая именно ошибка возникла. Если номер ошибки равен 0, то все нормально — ошибки не было.
  • Description — текстовое описание возникшей ошибки. Именно оно по умолчанию возвращается пользователю (хотя пользователь вряд ли в нем что-либо поймет). Скорее это — информация для разработчика.
  • Clear — этот метод очищает объект Err от старой информации об ошибках. То же самое делает и команда On Error GoTo 0.
  • Raise — возможность сгенерировать ошибку в программе, передав ей номер и описание. Очень полезная возможность для проверки поведения программы, если смоделировать ситуацию с реальной ошибкой трудно.

Надо сказать, что обработка ошибок — это очень надежный, но и очень ресурсоемкий метод работы. Если в вашей программе есть возможность обойтись без генерации и перехвата ошибок (например, проверить вводимое пользователем значение при помощи встроенных функций), то лучше так и делать. В то же время наличие обработчиков ошибок для того, чтобы справиться с действительно аварийными ситуациями — это большой плюс вашей программе (а зачастую и просто необходимость).




Далее