Вы можете самостоятельно инициировать исключительную ситуацию при выполнении тех или иных действий. Но, хотя синтаксис конструктора объекта Exception похож на конструкторы всех других объектов, создается он по- особенному.
Для этого используется оператор raise, за которым в качестве параметра должен идти экземпляр объекта типа Exception. Обычно сразу за оператором следует конструктор класса ИС:
raise EMathError.Create(' ');
но можно и разделить создание и возбуждение исключительной ситуации:
var E: EMathError;
Begin
E:= EMathError.Create С');
raise E;
end;
Оператор raise передает созданную исключительную ситуацию ближайшему блоку try..except (см. ниже).
if С = 0 then
raise EDivByZero.Create('Деление на ноль')
Else
А:= В/С;
Самостоятельная инициализация ИС может пригодиться при программировании реакции приложения на ввод данных, для контроля значений переменных и т. д. В таких случаях желательно создавать собственные классы ИС, специально приспособленные для ваших нужд. Также полезно использовать специально спроектированные исключительные ситуации при создании собственных объектов и компонентов. Так, многие важнейшие классы VCL — списки, потоки, графические объекты — сигнализируют о своих (или ваших?) проблемах созданием соответствующей ИС — EListError, EInvalidGraphic, EPrinter и т. д.
Самый важный отличительный признак объекта Exception — это все же класс, к которому он принадлежит. Именно факт принадлежности возникшей ИС к тому или иному классу говорит о том, что случилось. Если же нужно детализировать проблему, можно присвоить значение свойству Message. Если и этого мало, можно добавить в объект новые поля. Так, в ИС EinOutError (ошибка ввода/вывода) есть поле ErrorCode, значение которого соответствует произошедшей ошибке — запрету записи, отсутствию или повреждению файла и т. д.
Try
FileOpen('ñ:\myfile.txt', fmOpenWrite);
Except
on E: EinOutError do
case E.ErrorCode of
ERROR_FILE_NOT_FOUND {=2}: ShowMessage('Файл не найден!');
ERROR_ACCESS_DENIED {=5}: ShowMessage('Доступ запрещен!');
ERROR_DISK_FULL {=112}: ShowMessage ('Диск переполнен!');
end;
end;
Впрочем, ИС EInOutError возникают только тогда, когда установлена опция компилятора {$IOCHECKS ON} (или иначе {$I+}). В противном случае проверку переменной IOResult (известной еще по Turbo Pascal) нужно делать самостоятельно.