Исключения в Delphi, классы исключений
Исключения (exceptions) — это способ передачи информации об ошибке времени выполнения или о других исключительных ситуациях из того места, которое первым ее обнаружило, в код, предусмотренный для обработки таких ситуаций. В конечном итоге ошибки обусловлены неполной проработкой всех вариантов работы программы. В последующих версиях программы обнаруженные ошибки можно попытаться устранить, однако многое можно предусмотреть и сразу.
Особенности:
Обработка исключительных ситуаций или исключений отличается от традиционной обработки тем, что она позволяет отделить код, который обнаруживает ошибку, от кода, который реагирует на нее, а также тем, что предоставляет автоматический и ненавязчивый канал связи между этими двумя частями кода. Код, обнаруживающий ошибку, возбуждает исключения, сигнализируя о ее появлении. Код, реагирующий на сигнал ошибки, называется обработчиком исключения. Когда исключение возбуждено, начинается поиск подходящего обработчика исключения. После нахождения управление передается ему, и программа никогда не возвращается к коду, который вызвал исключение. После выполнения кода обработчика исключений либо продолжается выполнение программы с оператора, следующего за обработчиком, либо продолжается поиск другого обработчика событий. Это может кардинально изменить ход выполнения программы.
Модель исключительных ситуаций в Object Pascal является невозобновляемой (non-resumable). При возникновении исключительной ситуации вы уже не сможете вернуться в точку, где она возникла, для продолжения выполнения программы (это позволяет сделать возобновляемая (resumable) модель). Невозобновляемые исключительные ситуации разрушают стек, поскольку они сканируют его в поисках обработчика; в возобновляемой модели необходимо сохранять стек, состояние регистров процессора в точке возникновения ошибки и выполнять поиск обработчика и его выполнение в отдельном стеке. Возобновляемую систему обработки исключительных ситуаций гораздо труднее создать и применять, нежели невозобновляемую.
В Delphi исключительные ситуации появляются в форме объектов. Они возбуждаются и существуют до тех пор, пока исключение не будет обработано.
Обработка исключительной ситуации всегда уничтожает экземпляр исключения. Однако программист должен не только уметь обрабатывать исключения, но и правильно возбуждать исключения при возникновении ошибок.
Классы исключений
Современное направление в ООП использует классы и их экземпляры для работы с исключениями. Базовым классом для всех классов исключений в Delphi является класс Exception, непосредственный потомок от класса ТОbject. Это тот тип, который служит обработчиком по умолчанию для всех исключительных ситуаций.
Все классы исключения принято именовать с буквы «Е». Списки стандартных исключений, объявленных в Delphi, можно найти в литературе.
Класс Exception определен в модуле SysUtils примерно следующим образом : Базовый класс включает поле FMessage строкового типа, объявленное в разделе Private. Оно доступно с помощью свойства Message, имеющего прямой доступ к полю при чтении и записи его значения. Именно эта строка выводится при обработке исключительной ситуации по умолчанию.
Constructor Create(Const Msg: String);
Constructor CreateFmt(Const Msg: String; Const Args: Array Of Const); (форматированное сообщение)
Для использования ресурсов:
Constructor CreateRes(Ident: Integer); Overload;
Constructor CreateRes(ResStringRec: PResStringRec); Overload;
Есть ещё конструкторы для использования справочной системы
Конструктор Create принимает один параметр Msg типа String. Эта строка должна быть информативной или осмысленной строкой, представляющей исключение, либо класс исключений. И ещё много конструкторов.
Исключительные ситуации в базах данных
Среди классов-потомков класса Exception есть несколько классов, предназначенных для работы с базами данных. Прежде всего, это EDatabaseError и EDBEngineError. Последний представляет интерес для дальнейшего рассмотрения.
EDatabaseError=Class(Exception);// Класс определен в модуле DB
EDBEngineError=Class(EDatabaseError) // Определен в модуле DBTables
Если большая часть классов исключительных ситуаций Delphi просто выдает сообщение об ошибке, то исключительные ситуации баз данных созданы так, что позволяют предоставить список возможных ошибок, включая как коды ошибок локальных баз данных, так и SQL-серверов. Для этого у класса EDBEngineError есть два дополнительных свойства: ErrorCount (количество ошибок) и Errors (список всех ошибок). Каждый элемент свойства Errors является объектом класса TDBError, объявленного в модуле DB и имеющего пять свойств для чтения (Ro), возвращающих подробные сведения об ошибке.
В зависимости от кода ошибки можно предусмотреть различные варианты реакции на них. Коды всех ошибок BDE приведены в файле BDE.INT.
Тихие исключения
В архитектуре обработки исключительных ситуаций Delphi есть еще одно средство обработки исключений. Это любой экземпляр исключительной ситуации, инициированный из класса EAbort или его потомков. Фирма Borland называет эти исключения «тихими» (silent) или «скрытыми». Дело в том, что обработка таких исключений не поднимается выше одного уровня и не предусматривается вывода никаких сообщений. Фактически быстро уничтожаются исключения. Такая обработка не создается сама собой: ее необходимо в нужных случаях предусматривать и обрабатывать программисту.
Аппаратные исключения
Следует отметить, что помимо исключений Delphi существуют аппаратные исключения, связанные с работой аппаратного обеспечения и аппаратными прерываниями. К ним можно отнести ошибки, возникающие при работе принтера, дисковода и т.п. Имеется определенная возможность включить аппаратные исключения в исключения Delphi и таким образом обрабатывать подобные ситуации. Тем не менее, аппаратные исключения отличаются от исключений Delphi.