Исключительная ситуация - нештатное событие в процессе выполнение программы, способное повлиять на дальнейшее выполнение программы.
Компилятор Delphi генерирует код, который перехватывает любое такое нештатное событие, сохраняет необходимые данные о состоянии программы, и выдает разработчику. Что можно выдать в объектно-ориентированном языке программирования? Конечно же, объект. С точки зрения Object Pascal исключительная ситуация — это объект.
Вы можете получить и обработать этот объект, предусмотрев в программе специальную языковую конструкцию (try…except). Если такая конструкция не предусмотрена, все равно исключение будет обработано — в недрах библиотеки VCL есть соответствующие обработчики, окружающие все потенциально опасные места.
Класс Exception
Исключительные ситуации отличаются классом. В системном модуле Delphi SYSUTILS.PAS описан объектный тип Exception. Он является предком для всех других объектов — исключительных ситуаций. Программный код класса представлен ниже.
Exception = class (TObject)
|
|
Private
FMessage: string;
FHelpContext: Integer;
Public
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;
constructor CreateResFmt(Ident: Integer; const Args: array of const); overload;
constructor CreateResFmt(ResStringRec: PResStringRec; const Args: array of const); overload;
constructor CreateHelp(const Msg: string; AHelpContext: Integer);
constructor CreateFmtHelp(const Msg: string; const Args: array of const;
AHelpContext: Integer);
constructor CreateResHelp(Ident: Integer; AHelpContext: Integer); overload;
constructor CreateResHelp(ResStringRec: PResStringRec; AHelpContext: Integer); overload;
constructor CreateResFmtHelp(ResStringRec: PResStringRec; const Args: array of const; AHelpContext: Integer); overload;
constructor CreateResFmtHelp(Ident: Integer; const Args: array of const;
AHelpContext: Integer); overload;
property HelpContext: Integer read FHelpContext write FHelpContext;
property Message: string read FMessage write FMessage;
end;
ExceptClass = class of Exception;
Как видно из приведенного описания класса Exception, у него имеется двенадцать конструкторов, позволяющих задействовать при создании объекта текстовые строки из ресурсов приложения (имя включает строку Res), форматирование текста (включает Fmt), связь с контекстом справочной системы (включает Help).
Конструкторы, в названии которых встречается подстрока Fmt, могут вставлять в формируемый текст сообщения об ошибке значения параметров, как это делает стандартная функция Format:
If MemSize > Limit then
raise EOutOfMemory.CreateFmt('Cannot allocate more than %d bytes',[Limit]);
Тип Exception порождает многочисленные дочерние типы, соответствующие часто встречающимся случаям ошибок ввода/вывода, распределения памяти и т. п.
Заметим, что тип Exception и его потомки представляют собой исключение из правила, предписывающего все объектные типы именовать с буквы Т. Потомки Exception начинаются с Е, например EZeroDivide.
Таблица 1. Исключительные ситуации целочисленной математики (порождены отEIntError)
|
|
Тип | Условие возникновения |
EDivByZero | Попытка деления на ноль (целое число) |
ERangeError | Число или выражение выходит за допустимый диапазон |
EIntOverflow | Целочисленное переполнение |
Таблица 2. Исключительные ситуации математики с плавающей точкой (порождены от EMathError)
Тип | Условие возникновения |
EInvalidOp | Неверная операция |
EZeroDivide | Попытка деления на ноль |
EOverflow | Переполнение с плавающей точкой |
EUnderflow | Исчезновение порядка |
EInvalidArgument | Неверный аргумент математических функций |