7.2. Иерархия обработчиков ошибок
Включенным (enabled) считается обработчик, установленный оператором On Error, а активным (active) – тот, чей код выполняется в данный момент времени. Чтобы активизировать обработчик, его нужно сначала включить, но не все включенные обработчики активны. Например, после выполнения оператора Resume обработчик деактивизируется, но остается включенным.
Когда ошибка происходит в процедуре, в которой нет своей подпрограммы обработки ошибок, или в активном обработчике ошибок, Visual Basic просматривает список вызовов в поисках другого включенного обработчика. Список вызовов – последовательность вызванных процедур, которая привела в данную точку потока управления; он отображается в диалоговом окне Call Stack (Стек вызова) меню View (Вид). Данное окно открывается только в режиме прерывания.
Если допустить такую последовательность вызовов:
Процедура обработки события вызывает процедуру А.
Процедура А вызывает процедуру В.
Процедура В обращается к процедуре С.
То пока выполняется процедура С, другие процедуры приостанавливаются. Если в процедуре С возникает ошибка и в ней не окажется включенного обработчика ошибок, Visual Basic начинает просматривать процедуры в списке вызовов: сначала В, потом А и, наконец, дойдет до исходной процедуры обработки события (на ней этот процесс и закончится). При этом Visual Basic выполнит первый включенный обработчик ошибок из числа найденных. Не найдя ни одного включенного обработчика ошибок, он выведет на экран стандартное сообщение о неожиданной ошибке, после чего остановит программу. Если же Visual Basic найдет включенный обработчик ошибок, управление будет передано ему – так, будто ошибка произошла в процедуре, содержащей этот обработчик. Если в нем встретиться оператор Resume или Resume Next, выполнение возобновиться (таблица 7.2).
Таблица 7.2
Возобновление выполнения процедуры в соответствии с оператором, включенным в обработчик ошибок
Оператор | Результат |
Resume | Повторяется вызов из только что найденной процедуры. В данном случае, если в процедуре А есть включенный обработчик ошибок и он выполнит оператор Resume, Visual Basic повторит вызов процедуры В |
Resume Next | Выполнение продолжается с оператора, следующего за последним оператором, выполненным в этой процедуре (т.е. за вызовом). В данном случае, если в процедуре А есть включенный обработчик и он выполнит оператор Resume Next, программа возобновится с оператора, расположенного за вызовом процедуры В |
Выполнение возобновляется в процедуре, в которой найден обработчик ошибок, а вовсе не в процедуре, где собственно и произошла ошибка. Необходимо всегда учитывать это, иначе поведение программы станет непредсказуемым. Для упрощения отладка при каждом появлении ошибки можно просто переходить в режим прерывания.
Если возникла ошибка, на которую данный обработчик не рассчитан, в содержащей его процедуре произойдет непредвиденная ошибка. В этом случае процедура может просто зациклиться, особенно если обработчик выполняет оператор Resume. Чтобы предотвратить подобную ситуацию, необходимо использовать в блоке Case Else обработчика метод Raise объекта Err. Это приведет к генерации ошибки в самом обработчике и заставит Visual Basic просматривать список вызовов в поисках обработчика, способного обработать эту ошибку.
Результат обратного прохода по списку вызовов предсказать довольно трудно, так как он зависит от того, какой оператор будет выполнен в найденном обработчике.
Если создаются большие программы на Visual Basic, состоящие из множества модулей, код обработки ошибок может стать весьма сложным. При разработке подобных программ необходимо придерживаться следующих правил:
- при отладке следует использовать во всех обработчиках ошибок метод Raise объекта Err, генерируя повторную ошибку для тех случаев, когда обработка не предусмотрена. Тогда программа пытается исправить ошибку в других обработчиках (из списка вызовов). А если это не удастся, Visual Basic гарантированно сообщит об ошибке, необрабатываемой кодом. Тестируя код и следуя этой методике, можно выявить ошибки, которые программа пока не в состоянии обрабатывать адекватно;
- если следует явным образом сбросить объект Err после обработки ошибки, необходимо применять метод Clear. Visual Basic автоматически вызывает данный метод после выполнения любой разновидности оператора Resume, а также операторов Exit Sub, Exit Function, Exit Property или одной из форм оператора On Error;
- если нет необходимости, чтобы ошибку перехватила другая процедура из списка вызовов, следует использовать оператор Stop, чтобы в таких случаях прерывать программу. На этапе разработки это позволит использовать контекст ошибки и улучшить код;
- если написать специальную и очень надежную процедуру аварийного завершения, обработчики будут вызывать ее при появлении необрабатываемой ошибки, то она будет корректно завершать программу, выгружая форму и сохраняя данные.
- Министерство образования российской федерации
- М инистерство образования российской федерации
- Аннотация
- Содержание
- Тема 1. Основы программирования
- Создание, редактирование и запуск программ
- Переменные, константы и типы данных
- Управляющие конструкции
- Управляющая конструкция If…Then позволяет выполнять один или несколько операторов, если условие истинно. Можно использовать однострочный и блочный синтаксис. Например:
- Тема 2. Введение в модели объектов
- 2.1. Обзор моделей объектов
- 2.2. Автоматизация операций с использованием объектов
- 2.3. Программирование объектов другого приложения
- Тема 3. Объекты Microsoft Office
- 3.1. Объекты Microsoft Access
- 3.2. Объекты Microsoft Excel
- 3.3. Объекты Microsoft Power Point
- 3.4. Объекты Microsoft Word
- Тема 4. Меню и панели инструментов
- 4.1. Средства настройки пользовательского интерфейса
- 4.2. Выбор подходящих элементов пользовательского интерфейса
- 4.3. Система меню
- 4.4. Модификация системы меню на этапе разработки
- 4.5. Модификация системы меню в период выполнения
- 4.6. Панели инструментов
- 4.7. Модификация панелей инструментов на этапе разработки
- 4.8. Модификация панелей инструментов в период выполнения
- Тема 5. Элементы управления на базе ActiveX и диалоговые окна
- 5.1. Разработка нестандартных диалоговых окон
- 5.2. Использование нестандартных диалоговых окон
- 5.3. Работа с элементами управления в документе, листе или на слайде
- Тема 6. Оптимизация кода
- 6.1. Основные принципы оптимизации кода
- 6.2. Оптимизация кода для Microsoft Excel
- 6.3. Оптимизация кода для Microsoft Word
- Тема 7. Отладка и обработка ошибок
- 7.1. Создание обработчика ошибок
- 7.2. Иерархия обработчиков ошибок
- 7.3. Тестирование обработчика за счет эмуляции ошибок
- 7.4. Строчная обработка ошибок
- 7.5. Отключение обработки ошибок
- 7.6. Общие принципы отладки
- 7.7. Режимы конструктора, выполнения и прерывания
- 7.8. Окна отладки
- 7.9. Просмотр стека вызовов
- Тема 8. Разработка приложений для Интернета и Word Wide Web
- 8.1. Термины и концепции, связанные с Интернетом
- 8.2. Работа с гиперссылками
- 8.3. Сохранение документов и объектов в формате html
- 8.4. Элемент средства просмотра Web Microsoft
- 8.5. Элемент управления Internet Transfer
- Указывать допустимый сервер-заместитель в свойстве AccessType элемента управления Internet Transfer (таблица 8.4);
- Элемент управления Internet Transfer автоматически настраивается на нужный протокол, заданный в первой части url. Поэтому применение метода OpenUrl или Execute не требует установки свойства Protocol.
- 8.6. Элемент управления WinSock
- 8.7. Создание персонального Web-сервера
- Тестовые задания для закрепления материала учебного пособия
- Рекомендуемая литература
- Б) дополнительная литература