Обработка исключений контрацепция
Классы исключений определены в модулях Classes и SysUtils. Используются для обработки исключительных ситуаций, возникающих при исполнении программы. Например, попытка открыть файл, которого нет.
Базовый класс исключений – Exception. Его потомки – классы исключений, имена которых начинаются с символа E, за которым следует описание исключения на английском языке.
В модуле SusUtils опредлено много исключений. Вот примеры:
- EIntError – ошибка операции с целыми числами.
- EZeroDivide – деление на ноль.
- ERangeError – ошибка диапазона.
- EIntOverflow – ошибка переполнения.
- EMathError – математическая ошибка.
Для обработки исключений предусмотрены три инструкции:
- инструкции Raise,
- блоки try…except,
- блоки try…finally.
Внимание. Эти инструкции доступны в режимах Delphi и ObjPas. В режиме Turbo Pascal они невозможны.
Инструкция Raise
Инструкция Raise запускает исключение, которое предварительно должно быть определено, как экземпляр класса исключений. Формат инструкции:
Raise <Экземпляр класса>;
При возникновении объявленного исключения инициализируется экземпляр класса этого исключения. Пример обработки деления на ноль, когда этому исключению дано уникальное имя:
Type EDivException = Class(Exception);
Function DoDiv (X,Y : Longint) : Integer;
begin
If Y=0 then
Raise EDivException.Create (’Division by Zero would occur’);
Result := X Div Y;
end;
Инструкция try…except
Формат инструкции:
try // Попробуй
< Инструкции >
except // Исключения
<обработчики исключений>
end; // Конец
Алгоритм инструкции:
- Выполняется секция try.
- Если исключение не возникает, то инструкция завершается.
- Если исключение возникает, то секция try завершается и выполняется обработчик возникшего исключения из секции except.
Формат обработчика исключений в секции except
on
<класс исключения>
do < Инструкция >; // Любая инструкция, кроме goto
end;
Пример обработки деления на ноль (использованы средства из предыдущего примера):
Try
Z := DoDiv (X,Y);
Except
On EDivException do Z := 0;
end;
Инструкция try…finally
В ней при возникновении исключения секция try завершается, исключение специально не обрабатывается, но всегда исполняется секция finally. Формат инструкции:
try // Попробуй
<Инструкции >
finally // Финально
< Инструкции >
end; // Конец
Алгоритм инструкции
- Выполняется группа try.
- Если исключение возникло, то все инструкции, следующие после инструкции, вызвавшей исключение, пропускаются, и управление передается первой инструкция секции finally.
Если исключений не возникло, то секция finally все равно выполняется.