Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Исключения, определяемые пользователем

Поиск

Исключения, определяемые пользователем

Для определения своего типа исключения достаточно породить класс - наследник класса Exception:

type MyException =class(Exception) end;

Тело класса-исключения может быть пустым, но, тем не менее, новое имя для типа исключения позволит его разграничить с остальными исключениями:

try
...
except
on MyException do
writeln('Целочисленное деление на 0');
on Exception do
writeln('Файл отсутствует');
end;

Исключение может содержать дополнительную информацию, связанную с точкой, в которой произошло исключение:

type
FileNotFoundException = class(Exception)
fname: string;
constructor Create(msg,fn: string);
begin
inherited Create(msg);
fname := fn;
end;
end
;

...

procedureReadFile(fname: string);
begin
if not FileExists(fname) then
raise new FileNotFoundException('Файл не найден',fname);
end;

...

try
...
except
on e: FileNotFoundException do
writeln('Файл '+e.fname+' не найден');
end;

Повторная генерация исключения

Для повторной генерации исключения в блоке except служит оператор raise без параметров:

raise;

Например:

try
...
except
on FileNotFoundException do
begin
log.WriteLine('Файл не найден'); // запись в файл ошибок
raise;
end;
end;

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

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



Поделиться:


Последнее изменение этой страницы: 2024-06-27; просмотров: 2; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.123.61 (0.005 с.)