|
||||||||
|
Просмотр списка вызововДопустим такую последовательность вызовов: Процедура обработки события вызывает процедуру А. Процедура А вызывает процедуру В. Процедура В обращается к процедуре С.Пока выполняется процедура С, другие процедуры приостанавливаются Если в процедуре С возникнет ошибка и в ней не окажется включенного обработчика ошибок, Visual Basic начнет просматривать процедуры в списке вызовов: сначала В, потом А и, наконец, дойдет до исходной процедуры обработки события (на ней этот процесс и закончится). При этом Visual Basic выполнит первый включенный обработчик ошибок из числа найденных. Не найдя ни одного включенного обработчика ошибок, он выведет на экран стандартное сообщение о неожиданной ошибке, после чего остановит программу. Если же Visual Basic найдет включенный обработчик ошибок, управление будет передано ему ? так, будто ошибка произошла в процедуре, содержащей этот обработчик. Если в нем встретится оператор Resume или 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 |