ВУЗ:
Составители:
Рубрика:
1.5. Отладка программ и обработка ошибок 102
3
первый включенный обработчик ошибок из числа найденных. Не найдя ни
одного включенного обработчика ошибок, он выведет на экран стандартное
сообщение о неожиданной ошибке, после чего остановит программу.
Если же 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, то — с оператора в процедуре A,
расположенного за вызовом процедуры В. Так или иначе, но обработчик не
Страницы
- « первая
- ‹ предыдущая
- …
- 99
- 100
- 101
- 102
- 103
- …
- следующая ›
- последняя »