PascalABC.NET

Примеры обработки исключений

Пример 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 он будет закрыт.