Глава 2
ОБРАБОТКА ОШИБОК ПЕРИОДА ИСПОЛНЕНИЯ ПРОГРАММЫ
В стандартном языке Паскаль нет средств обработки так называемых исключительных ситуаций, т.е. ситуаций, связанных с возникновением той или иной ошибки в момент работы программы. В Турбо Паскале такие средства есть, но они не реализованы в виде стандартных подпрограмм. Отсутствие средств обработки исключительных ситуаций затрудняет создание различного рода диалоговых систем, в которых данные вводятся пользователем по запросам программы. В результате ошибки в подготовке данных в программах могут возникнуть некорректные ситуации типа деления на ноль или извлечения квадратного корня из отрицательного числа. Такие ситуации в программах на Турбо Паскале обрабатываются особой процедурой, которая дает краткое сообщение о характере и месте возникновения ошибки и аварийно завершает работу программы. В ряде случаев стандартное поведение программы требуется изменить, например сообщить пользователю о характере ошибки и вернуться в точку диалога, чтобы он мог ввести новые или отредактировать ранее введенные данные.
В этой главе обсуждаются средства, с помощью которых можно обрабатывать исключительные ситуации, и приводится текст модуля F_Jump, предназначенного для этих целей.
2.1. МЕХАНИЗМ ОБРАБОТКИ ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ
Для обработки исключительных ситуаций в Турбо Паскале предусмотрены соответствующие средства: в стандартный модуль System включена переменная ExitProc, с помощью которой можно перехватить управление программой в момент возникновения исключительной ситуации. По умолчанию эта переменная (она имеет тип Pointer) хранит значение NIL; если поместить в нее адрес некоторой процедуры пользователя (назовем ее процедурой выхода), то при возникновении исключительной ситуации управление передается в эту процедуру. Процедура выхода должна быть процедурой без параметров. Ее следует транслировать в расчете на дальнюю модель памяти.
Проиллюстрируем сказанное на примере простейшей процедуры выхода. Пусть ее задачей является только расшифровка стандартного сообщения Турбо Паскаля. Это сообщение имеет вид
Runtime error nnn at xxxx:yyyy,
где nnn — код (номер) ошибкИг -хххх: уууу — адрес той инструкции в коде программы, при выполнении которой возникла исключительная ситуация. Код ошибки и адрес ее возникновения хранятся в переменных ExitCode и ErrorAddr модуля System. Если в момент завершения программы эти пе—