[an error occurred while processing this directive] | |
1-й час. Знакомство с Visual Basic for Applications 3-й час. Работа с элементами управления 4-й час. Переменные и константы 6-й час. Логика условных операторов 7-й час. Циклические вычисления 9-й час. Основные объекты Excel 11-й час. Редактор Visual Basic 15-й час. Автоматизация экранных форм 20-й час. Получение внешних данных |
13-й час. Обработка ошибокВ предыдущем часе мы рассмотрели процесс отладки как процесс решения проблем, которые, в принципе, можно предвидеть и исправить. Но все ли возможные ситуации при выполнении приложения можно предвидеть и всеми ли процессами можно управлять? Пока приложение не велико, можно предсказать практически все, что может случиться в процессе его выполнения. С другой стороны, вы не можете управлять операционной системой и аппаратными средствами, а также поведением пользователя. Но именно эти факторы могут стать причиной возникновения разнообразных ошибок. В этом часе будут рассмотрены следующие вопросы.
Понятие об обработке ошибокРазрешение непредвиденных ситуаций при выполнении приложений называется обработкой ошибок. Процедуры, выполняющие обработку ошибок, называются, как нетрудно догадаться, обработчиками ошибок (error handler). Их назначение - отлов (перехват) в приложении ошибок и борьба с ними. В создании обработчика ошибок можно выделить три этапа.
Установка ловушек для ошибок означает вставку операторов перехвата ошибок, так что приложение знает, куда обратиться (какую процедуру вызвать), если эта самая ошибка случится.
Создание кода, который определяет тип ошибки и выполняет те или иные действия для разрешения проблем, вызванных ошибкой.
Другими слова, приложение должно знать, что делать после обработки ошибки. Перехват ошибокУстановка ловушек для ошибок в VBA осуществляется с помощью оператора On Error. В процедуре может быть только одна ловушка для ошибок. Но это не означает, что в процедуре возможен только один оператор On Error. Если в процедуре несколько операторов On Error, то на самом деле все равно должен выполняться только один из них. Есть два различных способа обработки ошибок. В первом способе инструкция, указывающая, что делать при возникновении ошибки, является частью оператора On Error. В VBA предусмотрены два таких оператора.
В случае ошибки управление снова передается оператору, при выполнении которого возникла ошибка.
В случае ошибки управление передается оператору, следующему за тем оператором, при выполнении которого возникла ошибка. Для блокировки обработчика ошибок применяется оператор On Error GoTo 0, который располагается после оператора On Error. Блокировка обработчика ошибок полезна при тестировании приложения, когда вы для чистоты эксперимента не хотите задействовать процедуру обработки ошибок. Первый способ обработки ошибок не является рекомендуемым или предпочтительным, так как ошибки здесь не обрабатываются, а просто игнорируются. Второй способ обработки ошибок использует оператор On Error для перехода к процедуре, где действительно происходит обработка ошибки. Это дает значительную гибкость в реагировании на различные типы ошибок. Во втором способе используется оператор On Error GoTo строка, где строка - это метка (line label) в строке кода процедуры, начиная с которой располагается код обработчика ошибок. Метка представляет собой имя, заканчивающееся двоеточием, что отличает ее от других идентификаторов языка VBA. Листинг 13.1 показывает структуру процедуры, содержащую обработчик ошибок. Листинг 13.1. Структура процедуры, содержащая обработчик ошибок
Написание процедуры обработки ошибсяПри возникновении ошибки VBA ищет метку, указанную в операторе On Error GoTo, и начинает исполнять код, следующий за этой меткой. Этот код определяет тип ошибки и в соответствии с этим выполняет те или иные действия. Обычно идентификация ошибок осуществляется с помощью операторов If и Select. В эти операторы необходимо всегда включать пункт Else, который будет отвечать за неопознанные ошибки. Выход из обработчика ошибокВ процедуре обработки ошибок для идентификации ошибок используются оператор If и Select и, следовательно, соответствующие условные выражения. В этих условных выражениях обычно проверяется значение свойства Number (Номер) объекта Err (Ошибка). Объект Err содержит информацию об ошибке, возникшей во время выполнения приложения, а свойство Number возвращает числовое значение, указывающее на тип ошибки. После определения типа ошибки и, возможно, выполнения каких-либо действий процедура обработки ошибок должна заканчиваться одним из следующих операторов.
Пример обработчика ошибокПосле небольшого экскурса в теорию обработки ошибок приступим к практическим занятиям. Вставьте новый модуль в рабочую книгу. Ниже приведены инструкции для создания процедуры, содержащей обработчик ошибок.
С помощью функции Error можно выводить текст, соответствующий возникшей ошибке. Измените процедуру ПримерОбработчик, как показано ниже (новый оператор выделен полужирным шрифтом).
Начните выполнение процедуры. Введите число 5 в первое окно ввода и число 0 - во второе. Появится окно сообщения, показанное на рис. 13.1. У вас может возникнуть мысль, что писать свой обработчик ошибок для каждой процедуры или функции не очень рационально. И вы будете совершенно правы. В следующем разделе я покажу, как создать централизованный обработчик ошибок.
Рис. 13.1. Текст сообщения, предложенный функцией Error Централизованный обработчик ошибокВместо того чтобы включать обработчик ошибок в каждую процедуру, можно создать централизованный обработчик ошибок - отдельную функцию, которая будет перехватывать ошибки, а затем, основываясь на номере ошибки, выполнять те или иные действия. Но все равно каждая процедура, в которой предусмотрена обработка ошибок, будет иметь оператор On Error. При возникновении ошибки этот оператор обращается к процедуре обработки ошибок, для которой функция-централизованный обработчик ошибок возвращает число, определяемое типом ошибки. Затем с помощью оператора Select Case выбирается оператор, осуществляющий выход из обработчика ошибок. Возможны следующие операторы выхода. (Оператор Resume описан выше.)
Обычно в локальную процедуру обработки ошибки функция-централизованный обработчик возвращает целое значение из интервала от 1 до 5 (как показано ниже), но это не правило, и вы можете создать свой централизованный обработчик, который будет более дифференцированно различать типы ошибок. Опишем процесс создания централизованного обработчика ошибок.
Как видите, функция централизованного обработчика имеет разветвляющуюся структуру, что позволяет затем в локальной процедуре обработки ошибок применять операторы Resume, Resume Next и другие необходимые операторы. Я рекомендую наряду с этими операторами использовать окна сообщений, которые выводили бы достаточно полную информацию о возникших ошибках. Вы можете использовать созданную здесь функцию централизованного обработчика ошибок в своих дальнейших разработках, скопировав и вставив ее в создаваемое приложение. РезюмеПроцесс отладки, рассмотренный нами в предыдущем часе, может найти и устранить те ошибки, которые локализованы в самом коде приложения, будь то синтаксические или логические ошибки. Но реальный процесс выполнения приложения на реальном компьютере также может привести к ошибкам выполнения, которые трудно заранее предусмотреть. В этом случае применяется процедуры обработки ошибок. Приложения, имеющие такие процедуры, устойчивы к ошибкам и работают стабильно. Если приложение состоит из нескольких процедур, то целесообразно создать централизованный обработчик ошибок. Вопрос и ответыВопрос. Можно ли искусственно вызвать ошибку? Ответ. Для генерации ошибок можно использовать метод Raise, который часто применяется при тестировании и отладке приложений. Вопрос. У меня одна процедура вызывает другую, при этом вызываемая процедура не имеет обработчика ошибок, а вызывающая - имеет. Что случится, если возникнет ошибка? Ответ. Если вызываемая процедура не имеет обработчика ошибок, то VBA использует обработчик вызывающей процедуры. ПрактикумС помощью тестов и упражнений вы проверите, насколько хорошо усвоили изложенный материал. Ответы на вопросы смотрите в Приложении. Тесты
УпражнениеСоздайте следующую процедуру:
Добавьте в эту процедуру код обработчика ошибок, который отображал бы окно с соответствующим сообщением и передавал управление оператору, следующему за оператором, вызывающим ошибку. |
[an error occurred while processing this directive] |