Вход


Главная страница >> Учебный процесс >> Конспекты >> MS Office. Руководство программиста по Visual Basic для MS Office 97 >> Отладка и обработка ошибок >> Иерархия обработчиков ошибок >> Просмотр списка вызовов

Переход на главную страницу

Сервер поддерживается
кафедрой информатики и вычислительной техники ГрГУ
тел. +375-(0)152-445-101
E-mail :
kadan@grsu.grodno.by


[Назад]    [Содержание ]    [Вперед]

  


Просмотр списка вызовов


Допустим такую последовательность вызовов:

Процедура обработки события вызывает процедуру А. Процедура А вызывает процедуру В. Процедура В обращается к процедуре С.

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

Если же Visual Basic найдет включенный обработчик ошибок, управление будет передано ему ? так, будто ошибка произошла в процедуре, содержащей этот обработчик. Если в нем встретится оператор Resume или Resume Next, выполнение возобновится, как показано в таблице:

Оператор Результат
Resume Повторяется вызов из только что найденной процедуры. В данном случае, если в процедуре А есть включенный обработчик ошибок и он выполнит оператор Resume, Visual Basic повторит вызов процедуры В.
Resume Next Выполнение продолжается с оператора, следующего за последним оператором, выполненным в этой процедуре (т.е. за вызовом). В данном случае, если в процедуре А есть включенный обработчик ошибок и он выполнит оператор Resume Next, программа возобновится с оператора, расположенного за вызовом процедуры В.

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

Если возникла ошибка, на которую данный обработчик не рассчитан, в содержащей его процедуре произойдет непредвиденная ошибка. В этом случае процедура может просто зациклиться, особенно если обработчик выполняет оператор Resume. Чтобы предотвратить подобную ситуацию, используйте в блоке Case Else обработчика метод Raise объекта Err. Это приведет к гене-рации ошибки в самом обработчике и заставит Visual Basic просматривать список вызовов в поисках обработчика, способного обработать эту ошибку.

Результат обратного прохода по списку вызовов предсказать довольно трудно, так как он зависит от того, какой оператор (Resume или Resume Next) будет выполнен в найденном обработчике. Resume возвращает управление оператору, который последним вызвал процедуру с этим обработчиком ошибок, a Resume Next ? следующему за таким оператором.

Например, если в процедуре А есть включенный обработчик ошибок, а в процедурах В и С? нет, ошибка, возникшая в процедуре С, обрабатывается соответствующим кодом в процедуре А. Если этот обработчик выполнит оператор Resume, программа возобновится с вызова процедуры В, а если он выполнит оператор Resume Next, то ? с оператора в процедуре А, расположенного за вызовом процедуры В. Так или иначе, но обработчик не вернет управление непосредственно той процедуре или оператору, где собственно и возникла ошибка.



[Назад]    [Содержание ]    [Вперед]

  



Текст пособия подготовлен на основе материалов книги
Microsoft Corporation. Руководство программиста по Visual Basic для Microsoft Office 97 / Пер. с англ. - М.: Издательский отдел "Русская Редакция" ТОО "Channel Trading Ltd.", 1997. - 544 с.: илл.
c Оригинальное издание на английском языке,
Microsoft Corporation, 1997
c Русский перевод,
Microsoft Corporation, 1997

  
За содержание страницы отвечает Гончарова М.Н.
©
Кафедра СПиКБ, 2002-2017