Скачать презентацию Исключительные ситуации Исключительная ситуация как класс некое Скачать презентацию Исключительные ситуации Исключительная ситуация как класс некое

Исключительные ситуации.ppt

  • Количество слайдов: 16

Исключительные ситуации Исключительная ситуация как класс — некое нештатное событие, могущее повлиять на дальнейшее Исключительные ситуации Исключительная ситуация как класс — некое нештатное событие, могущее повлиять на дальнейшее выполнение программы. С точки зрения Object Pascal исключительная ситуация — это объект Получить и обработать этот объект, можно предусмотрев в программе специальную языковую конструкцию (try. . except).

Если такая конструкция не предусмотрена, все равно исключение будет обработано. В VCL есть соответствующие Если такая конструкция не предусмотрена, все равно исключение будет обработано. В VCL есть соответствующие обработчики, окружающие все потенциально опасные места. Как отличить одну исключительную ситуацию от другой? Поскольку это объекты, они отличаются классом (объектным типом).

В модуле SYSUTILS. PAS описан объектный тип Exception. Он является предком для всех других В модуле SYSUTILS. PAS описан объектный тип Exception. Он является предком для всех других объектов — исключительных ситуаций: Exception = class(TObject) private FMessage: string; FHelp. Context: Integer; public constructor Create(const Msg: string); constructor Create. Fmt(const Msg: string; const Args: array of const); constructor Create. Res(Ident: Integer); overload; constructor Create. Res(Res. String. Rec: PRes. String. Rec); overload;

constructor Create. Res. Fmt(Ident: Integer; const Args: array of const); overload; constructor Create. Res. constructor Create. Res. Fmt(Ident: Integer; const Args: array of const); overload; constructor Create. Res. Fmt(Res. String. Rec: PRes. String. Rec; const Args: array of const); overload; constructor Create. Help(const Msg: string; AHelp. Context: Integer); constructor Create. Fmt. Help(const Msg: string; const Args: array of const; AHelp. Context: Integer); constructor Create. Res. Help(Ident: Integer; AHeip. Context: Integer); overload; constructor Create. Res. Help(Res. String. Rec: PRes. String. Rec; AHelp. Context: Integer); overload; constructor Create. Res. Fmt. Help(Res. String. Rec: PRes. String. Rec; const Args: array of const; AHelp. Context: Integer); overload; constructor Create. Res. Fmt. Help(Ident: Integer; const Args: array of const; AHelp. Context: Integer); overload; property Help. Context: Integer read FHelp. Context write FHelp. Context; property Message: string read FMessage write FMessage; end; Except. Class = class of Exception;

Как видно из приведенного описания класса Exception, у него имеется двенадцать (!) конструкторов, позволяющих Как видно из приведенного описания класса Exception, у него имеется двенадцать (!) конструкторов, позволяющих задействовать при создании объекта текстовые строки из ресурсов приложения (имя включает строку Res), форматирование текста (включает Fmt), связь с контекстом справочной системы (включает Help).

Конструкторы, в названии которых встречается подстрока Emt, могут вставлять в формируемый текст сообщения об Конструкторы, в названии которых встречается подстрока Emt, могут вставлять в формируемый текст сообщения об ошибке значения параметров. Если в названии присутствует подстрока Res, это означает, что текст сообщения будет загружаться из ресурсов приложения. (Это особенно полезно при создании локализованных версий программных продуктов, когда нужно сменить язык всех сообщений, ничего не компилируя заново).

Если в названии фигурирует подстрока Help, то такой конструктор инициализирует свойство Help. Context создаваемого Если в названии фигурирует подстрока Help, то такой конструктор инициализирует свойство Help. Context создаваемого объекта. Естественно, система помощи должна быть создана и в ней должна иметься статья, связанная с этим контекстом. Теперь пользователь может затребовать помощь для данной ситуации, скажем, нажав клавишу в момент показа сообщения об ИС.

Тип Exception порождает многочисленные дочерние типы, соответствующие часто встречающимся случаям ошибок ввода/вывода, распределения памяти Тип Exception порождает многочисленные дочерние типы, соответствующие часто встречающимся случаям ошибок ввода/вывода, распределения памяти и т. п. Тип Exception и его потомки представляют собой исключение из правила, предписывающего все объектные типы именовать с буквы Т. ПОТОМКИ Exception начинаются с Е, например EZero. Divide.

Можно самостоятельно инициировать исключительную ситуацию при выполнении тех или иных действий. Но, хотя синтаксис Можно самостоятельно инициировать исключительную ситуацию при выполнении тех или иных действий. Но, хотя синтаксис конструктора объекта Exception похож на конструкторы всех других объектов, создается он поособенному. Описания этих групп исключительных ситуаций:

Таблица 1. Исключительные ситуации при работе с памятью (порождены от EHeap. Exception) Тип Условие Таблица 1. Исключительные ситуации при работе с памятью (порождены от EHeap. Exception) Тип Условие возникновения EOut. Of. Memory Недостаточно места в куче (памяти) EOut. Of. Resources Нехватка системных ресурсов EInvalid. Pointer Недопустимый указатель (обычно n i l ) Таблица 2. Исключительные ситуации целочисленной математики (порождены от EInt. Error) Тип Условие возникновения EDiv. By. Zero Попытка деления на ноль (целое число) ERange. Error Число или выражение выходит за допустимый диапазон EInt. Overflow Целочисленное переполнение

Таблица. 3. Исключительные ситуации математики с плавающей точкой (порождены ОТ EMath. Error) Тип Условие Таблица. 3. Исключительные ситуации математики с плавающей точкой (порождены ОТ EMath. Error) Тип Условие возникновения Einvalid. Op Неверная операция EZero. Divide Попытка деления на ноль Eoverflow Переполнение с плавающей точкой EUnderflow Исчезновение порядка Einvalid. Argument Неверный аргумент математических функций Для создания конструктора используется оператор raise, за которым в качестве параметра должен идти экземпляр объекта типа Exception.

Обычно сразу за оператором следует конструктор класса ИС: raise EMath. Error. Create( Обычно сразу за оператором следует конструктор класса ИС: raise EMath. Error. Create("); Но можно и разделить создание и возбуждение исключительной ситуации: var E: EMath. Error; begin Е : = EMath. Error. Create ("); raise E; end; Оператор raise передает созданную исключительную ситуацию ближайшему блоку try …. except

if С = 0 then raise EDiv. By. Zero. Create('Деление на ноль') else А if С = 0 then raise EDiv. By. Zero. Create('Деление на ноль') else А : = В/С; Самостоятельная инициализация ИС может пригодиться при программировании реакции приложения на ввод данных, для контроля значений переменных и т. д. В таких случаях желательно создавать собственные классы ИС, специально приспособленные для ваших нужд. Также полезно использовать специально спроектированные исключительные ситуации при создании собственных объектов и компонентов.

Так, многие важнейшие классы VCL — списки, потоки, графические объекты — сигнализируют о своих Так, многие важнейшие классы VCL — списки, потоки, графические объекты — сигнализируют о своих (или ваших? ) проблемах созданием соответствующей ИС — EList. Error, EInvalid. Graphic, EPrinter и т. д. Самый важный отличительный признак объекта Exception — это класс, к которому он принадлежит. Именно факт принадлежности возникшей ИС к тому или иному классу говорит о том, что случилось. Если же нужно детализировать проблему, можно присвоить значение свойству Message. Если и этого мало, можно добавить в объект новые поля.

Например, в ИС Ein. Out. Error (ошибка ввода/вывода) есть поле Error. Code, значение которого Например, в ИС Ein. Out. Error (ошибка ввода/вывода) есть поле Error. Code, значение которого соответствует произошедшей ошибке - запрету записи, отсутствию или повреждению файла и т. д. Try File. Open('с: myfile. txt', fm. Open. Write); except on E: Ein. Out. Error do case E. Error. Code of ERROR_FILE_NOT_FOUND {=2}: Show. Message('Файл не найден ! ' ) ; ERROR_ACCESS_DENIED {=5}: Show. Message('Доступ запрещен!'); ERROR_DISK_FULL {=112}: Show. Message('Диск переполнен!'); end;

Однако, ИС Ein. Out. Error возникают только тогда, когда установлена опция компилятора {$IOCHECKS ON} Однако, ИС Ein. Out. Error возникают только тогда, когда установлена опция компилятора {$IOCHECKS ON} (ИЛИ иначе {$1+}). В противном случае проверку переменной i. OResuit нужно делать самому.