Примеры обработки исключений
Пример 1. Обработка неверного ввода данных.
Рассмотрим программу.
var i: integer;
begin
readln(i);
writeln(i);
writeln('Выполнение программы продолжается');
end.
Если при вводе данных произойдет ошибка (например, мы введем
не число), то программа завершится с ошибкой (ошибка ввода), и последующие
операторы writeln
не будут выполнены.
Перехватим исключение в блоке try
:
var i: integer;
begin
try
readln(i);
writeln(i);
except
writeln('Ошибка ввода');
end;
writeln('Выполнение программы продолжается');
end.
На этот раз при возникновении ошибки ввода программа не будет
завершена, а выполнение будет передано в блок except
,
после чего выполнение программы продолжится дальше. Таким образом, в последней
программе не выполнится лишь оператор writeln(i)
.
Если в блоке try
могут
возникнуть различные исключения, то обычно используется вторая форма блока
except
с несколькими обработчиками
исключений.
Пример 2. Обработка различных исключений.
var a,b: integer;
assign(f,'a.txt');
try
readln(a,b);
reset(f);
c:=a div b;
except
on System.DivideByZeroException do
writeln('Целочисленное деление на 0');
on System.IO.IOException do
writeln('Файл отсутствует');
end;
Часто необходимо совмещать обработку исключений и
освобождение ресурсов независимо от того, произошло исключение или нет. В этом
случае используются вложенные операторы try
...
except
и try
...
finally
.
Пример 3. Вложенные операторы try
... except
и try
... finally
.
assign(f,'a.txt');
try
reset(f);
try
try
c:=a div b;
except
on System.DivideByZeroException do
writeln('Целочисленное деление на 0');
end;
finally
close(f);
end;
except
on System.IO.IOException do
writeln('Файл отсутствует');
end;
Обратим внимание, что в данном примере исключение, связанное
c целочисленным делением на 0, обрабатывается в самом внутреннем
блоке try
, а исключение, связанное с
отсутствующим файлом - в самом внешнем. При этом, если файл был открыт, то
независимо от возникновения исключения деления на 0 он будет закрыт.