Тип Exception порождает многочисленные дочерние типы, соответствующие часто встречающимся случаям ошибок ввода/вывода, распределения памяти и т. п. Дерево исключительных ситуаций Delphi 7 приведено на рис. 3.1.

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

Для экономии места потомки нескольких важных объектов не показаны. Ниже приведены табл. 3.1-3.3, содержащие описания этих групп исключительных ситуаций.

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

Программирование в Delphi 7

Рис. 3.1. Дерево объектов исключительных ситуаций Delphi 7

Таблица 3.1. Исключительные ситуации при работе с памятью

(порождены ОТ EHeapException)

Тип

Условиевозникновения

ЕСХЛС^Метогу

Недостаточно места в куче (памяти)

ЕОиЪС^Кезоигсеэ

Нехватка системных ресурсов

Е1ггта.11ёРо;1.гЛег

Недопустимый указатель (обычно п \ 1)

Таблица 3.2. Исключительные ситуации целочисленной математики

(попожпены ОТ F.TntFrmr)

Tliin

EDivByZero ERangeError EIntOverflow

Попытка деления на ноль (целое число)

Число или выражение выходит за допустимый диапазон

Целочисленное переполнение

ТаблицаЗ. 3. Исключительныеситуацииматематикисплавающейточкой

_(порождены ОТttfErrnr)

~1ин-Условие возникновенияEInvalidOp Неверная операция

EZeroDivide Попытка деления на ноль

EOverf îow Переполнение с плавающей точкой

EUnderflow Исчезновение порядка

_EInvalidArgument_HpRppwRTU apryiupwT матрматтячррутяу фунутттяй_

Для этого используется оператор raise, за которым в качестве параметра должен идти экземпляр объекта типа Exception. Обычно сразу за оператором следует конструктор класса ИС:

raise EMathError.Create ( ' ' ) ;

но можно и разделить создание и возбуждение исключительной ситуации:

var Е: EMathError;
begin
Е := EMathError.Create [ "
) ;
raise E;
end;

Оператор raise передает созданную исключительную ситуацию ближайшему блоку try. .except (см. ниже).

if С = О then

raise EDivByZero.Create('Деление на ноль')

else

А:=В/С;

Самостоятельная инициализация ИС может пригодиться при программировании реакции приложения на ввод данных, для контроля значений переменных и т. д. В таких случаях желательно создавать собственные классы ИС, специально приспособленные для ваших нужд. Также полезно использовать специально спроектированные исключительные ситуации при создании собственных объектов и компонентов. Так, многие важнейшие классы VCL - списки, потоки, графические объекты - сигнализируют о своих (или ваших?) проблемах созданием соответствующей ИС - EListError,

EInvalidGraphic, EPrinter И Т. Д.

Самый важный отличительный признак объекта Exception - это все же класс, к которому он принадлежит. Именно факт принадлежности возникшей ИС к тому или иному классу говорит о том, что случилось. Если же нужно детализировать проблему, можно присвоить значение свойству Message. Если и этого мало, можно добавить в объект новые поля. Так, в ИС EinOutError (ошибка ввода/вывода) есть поле ErrorCode, значение которого соответствует произошедшей ошибке - запрету записи, отсутствию или повреждению файла и т. д.


⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в Delphi 7



Новости за месяц

  • Декабрь
    2017
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс