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

Как уже отмечалось выше, одной из основных проблем являются ошибки выполнения. Эти ошибки возникают при попытке произвести недопустимую операцию, например, при открытии несуществующего файла, делении на ноль, или при обработке неправильно введенных пользователем данных.

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

Пользователь может без всякого умысла произвести действия, которые нанесут непоправимый вред данным. Следовательно, необходимо каким-то образом оградить себя от возникновения подобных ситуаций.

При программировании имеются два подхода:

Предотвращение ошибочных ситуаций.

Обработка ошибки с помощью специальной процедуры.

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

Существует ли файл, который требуется открыть?

Находится ли курсор в требуемой для выполнения макроса позиции?

Перехватываемые ошибки.

Перехват используется в том случае, когда предотвратить возникновение ошибочных ситуаций невозможно. Полный список перехватываемых ошибок приводится в разделе системы справочной информации Visual Basic "Перехватываемые ошибки" (Trappable Errors). Ниже описываются только некоторые из них.

КОД СООБЩЕНИЕ

3 Инструкция Return без Gosub6 Переполнение7 Не хватает памяти9 Индекс выходит за пределы допустимого диапазона11 Деление на 018 Произошло прерывание, вызванное пользователем35 Процедура Sub, Function или Property не определена53 Файл не найден61 Переполнение диска71 Диск не готов91 Не задана объектная переменная блока With97 Невозможен вызов процедуры Friend для объекта, не являющегося экземпляром определяющего класса335 Невозможен доступ к системному реестру368 Истек срок данного системного файла. Программе требуется файл более новой версии402 Сначала необходимо закрыть самую верхнюю модальную форму422 Свойство не найдено440 Ошибка программирования объектов448 Именованный аргумент не найден482 Ошибка принтера31032 Невозможно создать внедренный объект

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

Перехват ошибок.

Обработка ошибок выполнения в VBA называется перехватом ошибки. Правильно разработав подпрограмму обработки ошибок, можно задать отклик на многие возможные ошибки. Наиболее важно, чтобы ошибка не остановила выполнение процедуры. При этом пользователь может даже не заметить, что произошла ошибка.

Система перехвата ошибок включает следующие компоненты:

Инструкция On Error устанавливает перехват ошибки. Она сообщает процедуре, что делать, если произошла ошибка, обычно передавая управление подпрограмме обработки ошибки.

Подпрограмма обработки ошибки - это часть выполняемой процедуры, которая используется для обработки ошибок. Обычно в ней определяется тип возникшей ошибки, а затем производятся соответствующие действия. Начало подпрограммы обработки идентифицируется меткой.

Объект Err содержит информацию о возникшей ошибке. Подобно любому объекту он имеет свои свойства, включая номер и описание ошибки.

Инструкция Resume позволяет процедуре продолжить операции после обработки ошибки.

Инструкция Exit позволяет выйти из процедуры, не выполняя оставшийся код. Данная инструкция используется очень часто, поскольку если ошибок не возникло, то не следует исполнять подпрограмму обработки ошибки.

Общие сведения о перехвате ошибок.

Общее правило перехвата ошибок можно пояснить на примере следующей процедуры:

Sub MyProcedure ()On Error GoTo MyErrorHandler'…' Обычные действия, при выполнении каждого из' которых может произойти ошибка'…Exit Sub ' Выход для обхода подпрограммы обработки ошибкиMyErrorHandler:'…' Подпрограмма обработки ошибки'…ResumeEnd Sub

Инструкция On Error устанавливает перехват ошибки для невыполненной части макроса, указывая на подпрограмму обработки ошибки. В макросе может быть несколько инструкций On Error, каждая из которых определяет разные процедуры обработки. В предыдущем примере при возникновении ошибки управление передается инструкции с меткой MyErrorHandler.

Инструкция On Error имеет три формы:

Инструкция On Error GoTo метка позволяет передать управление подпрограмме обработки ошибки, которая идентифицируется меткой.

Инструкция On Error Resume Next позволяет игнорировать ошибку и продолжить выполнение со следующей инструкции после той, при исполнении которой возникла ошибка. Если ошибка вызывает возникновение других ошибок, то лучше не применять данную форму инструкции On Error.

Для определение типа ошибки и выполнения, соответствующих ей действий имеется возможность получить значение свойства Number объекта Err.

Инструкция On Error GoTo 0 отключает обработку ошибок для данной процедуры. Данная инструкция обычно указывается после первых двух форм инструкции On Error ниже строк, в которых могут возникнуть ошибки. Поскольку подпрограмма обработки уже сыграла свою роль, можно не перехватывать ошибки.

В любом случае инструкция On Error устанавливает обработку ошибок только в той процедуре, в которой она указана.

Инструкцию On Error можно указывать произвольное число раз, изменяя способ обработки ошибок.

Sub MySub ()'…On Error GoTo MyHandler'…OnError Resume Next'…On Error GoTo 0'…MyHandler:'…ResumeEnd Sub

Метка, которая помечает начало подпрограммы обработки ошибок, является параметром инструкции GoTo. Меткой является любое допустимое имя, оно располагается в самом начале строки, а сразу за ней ставится (:).

Обратите внимание, что в инструкции GoTo двоеточие не используется, т.к. оно не является частью имени. Двоеточие только идентифицирует метку.

Инструкция Resume указывается в конце подпрограммы обработки ошибок после выполнения всех требуемых действий. Она возобновляет исполнение процедуры, в которой возникла ошибка.

Совет.

Инструкцию Resume можно использовать только в подпрограмме обработки ошибки. В противном случае возникает ошибка.

Инструкция Resume имеет три формы:

Инструкция Resume Next передает управление инструкции, которая следует за той, в которой возникла ошибка. Предполагается, что подпрограмма обработки устранила последствия ошибки.

Инструкция Resume или Resume 0 передает управление инструкции, в которой возникла ошибка, и VBA производит попытку выполнять эту строку снова. Предполагается, что подпрограмма обработки устранила причины, которые вызвали ошибку, и теперь инструкцию можно выполнить без ошибки.

Инструкция Resume метка передает управление инструкции, идентифицированной указанной меткой.

Инструкция Resume является необязательной. Если требуется завершить выполнение процедуры после обработки ошибки, то можно опустить эту инструкцию.

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

Инструкция Exit используется для того, чтобы не выполнять подпрограмму обработки ошибки, если ошибка не возникла. Поскольку подпрограмма обработки является частью процедуры, то она будет исполняться если не выйти из макроса.

Инструкция Exit имеет пять форм, указывающих на блок, из которого требуется выйти:

Exit SubExit FunctionExit DoExit ForExit Property

В процедурах, в которых имеется подпрограмма обработки ошибки, обычно используются инструкции Exit Sub или Exit Function в зависимости от типа выполняемой процедуры.

Объект Err и подпрограмма обработки ошибки.

Во многих ситуациях имеется большое число потенциальных ошибок, а подпрограмма обработки должна выполнять определенные действия в зависимости от возникшей ошибки. С помощью объекта Err можно во время выполнения процедуры выявить тип ошибки. Обратите внимание, что если подпрограммы обработки не имеется, то выводится стандартное сообщение.

Объект Err - глобальный объект, который содержит информацию о последней возникшей ошибке. Подобно любому другому объекту он имеет свойства и методы. Используя свойства объекта Err и выполняя его методы можно сообщить подпрограмме обработки характер произошедшей ошибки.

Объект Err имеет шесть свойств:

Свойство Number - номер возникшей ошибки.

Свойство Source - имя проекта Visual Basic, в котором произошла ошибка.

Свойство Description - строка, соответствующая номеру ошибки. Некоторые ошибки, включая заданные пользователем ошибки, не имеют описания и тогда строка имеет значение "Ошибка, определяемая приложением" или "Ошибка, определяемая объектом".

Свойство HelpFile - полное имя файла справки Visual Basic, включая диск и путь.

Свойство HelpContext - идентификационный номер в справке Visual Basic, соответствующий возникшей ошибке.

Свойство LastDLLError содержит код системной ошибки для последнего вызова библиотеки динамической компоновки. Используется только в 32-разрядных системах Microsoft Windows и доступно только для чтения.

Обычно, чтобы произвести определенные действия в зависимости от типа возникшей ошибки, требуется просто проверить значение свойства Number. Для этого используется любая логическая инструкция, например, блок If..Else..End If или Select Case..End Select. Блок Select Case..End Select удобнее, т.к. в него проще добавить дополнительное условие.

Заданным по умолчанию свойством объекта Err является свойство Number, поэтому нижеприведенные инструкции эквивалентны:

Select Case Err.Number

Select Case Err

Использование полного синтаксиса упрощает понимание программы. Сокращенный синтаксис совместим только в одну сторону с предыдущими версиями Visual Basic и WordBasic, в которых вместо объекта Err применялась функция Err. Объект Err имеет два метода:

Метод Raise позволяет генерировать ошибку во время выполнения программы. Данный метод используется для проверки подпрограммы обработки ошибки, которую требуется перехватить. Кроме того, с его помощью можно создать для приложения собственные ошибки, указав их номер и описание.

При задании собственных ошибок необходимо сложить номер ошибки с константой vbObjectError. Таким образом, можно гарантировать, что номер не совпадает с номером стандартной ошибки Visual Basic. Приведем пример, в котором создается новая ошибка:

Err.Raise vbObjectError + 1, "MyProject.MyObject", "Служащего с таким именем в данном отделе не имеется"

Метод Clear сбрасывает значения всех свойств объекта Err. Данный метод используется после того, как обработана ошибка и необходимо продолжить выполнение.

Примечание.

В ранних версиях Visual Basic и других языках Basic для создания ошибок использовалась инструкция Error. В целях обеспечения инструкция Error имеется и в новом Visual Basic, однако, во всех вновь создаваемых программах рекомендуется применять объект Err.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: