SetJump(Jump); {Контролируем деление} if ErrorAddr <> NIL then begin

WriteLn('Ошибка при делении чисел');

Goto Loop end else

r := 1/r;

WriteLn(r:20:10) until r = 1;

ExitProc := OldExit {Нормальный выход} end.

Как нетрудно заметить, процедура обработки исключительной ситуации MyExit в рассмотренном примере просто возвращает управление в нужную точку программы. Разумеется, в реальной программе ее можно сделать более сложной. Однако для большей «прозрачности» программы я рекомендую все дополнительные действия, связанные с обработкой исключительной ситуации, размещать в теле основной программы — ведь в критических точках обычно используются условные операторы вида

if ErrorAddr о NIL then ...

Отмечу одну особенность: непосредственно перед передачей управления в пользовательскую процедуру выхода Турбо Паскаль автоматически помещает в переменную ExitProc значение NIL. По этой причине оператор

ExitProc := SMyExit

помещен в тело цикла Repeat... Until. Если разместить его перед оператором Repeat, то после первой же ошибки программа перестанет обрабатывать исключительные ситуации, поэтому повторная ошибка приведет к аварийному завершению программы.

При использовании описанного средства обработки исключительных ситуаций в сложных программах с несколькими модулями следует учесть, что при передаче управления в подпрограмму другого модуля обычно изменяется значение сегмента кода. Если Вы использовали процедуру обработки ошибки в одном модуле, а ошибка возникла в процедуре из другого модуля, управление передается в процедуру обработки ошибки со значением сегмента кода, соответствующим модулю, в котором произошла ошибка. В результате процедура LongJump не сможет установить правильный NEAR— адрес переменной Jump и программа «зависнет». Чтобы этого не произошло, LongJump должна использовать FAR— адрес переменной Jump. Проще всего этого можно достичь, если поместить переменную Jump в интерфейсную часть любого модуля и использовать эту переменную для организации обработки исключительных ситуаций.