Следует обратить внимание, что имя переменной исключения в разных обработчиках может быть одинаковым, т.е. оно локально по отношению к обработчику.
Поиск типа исключения в обработчиках производится с учетом наследования: исключение будет обработано, если оно принадлежит к указанному в обработчике типу или производному от него. Поэтому принято записывать вначале обработчики производных классов, а затем - обработчики базовых (в противном случае обработчик исключения производного класса никогда не сработает). Обработчик исключения Exception обрабатывает все возможные исключения и поэтому должен быть записан последним.
Пример.
var a: array [1..10] of integer;
try
var i: integer;
readln(i);
writeln(a[i] div i);
...
except
on System.DivideByZeroException do
writeln('Деление на 0');
on e: System.IndexOutOfRangeException do
writeln(e.Message);
on System.FormatException do
writeln('Неверный формат ввода');
else writeln('Какое-то другое исключение');
end;
Оператор try ... finally
Оператор try ... finally имеет вид:
try
операторы
finally
операторы
end;
Операторы в блоке finally выполняются безотносительно к тому, возникло или нет исключение в блоке try. При этом само исключение не обрабатывается.
Блок finally используется для возвращения ранее выделенных ресурсов.
Пример 1. Закрытие открытого файла.
reset(f);
try
...
finally
close(f);
end;
Файл будет закрыт независимо от того, произошло ли ислючение в блоке try.
Пример 2. Возвращение выделенной динамической памяти.
New(p);
try
...
finally
Dispose(p);
end;
Динамическая память, контролируемая указателем p, будет возвращена независимо от того, произошло ли ислючение в блоке try.
Оператор raise
Оператор raise предназначен для возбуждения исключения и имеет вид:
raiseобъект
Здесь объект - объект класса, производного от Exception. Например:
raise new Exception('Ошибка');
При возбуждении специфического исключения желательно определить свой тип исключения.
Для повторной генерации исключения внутри секции except используется также вызов raise без параметров:
raise;
Операторы += и -= для процедурных переменных
Оператор присваивания += предназначен для присоединения к процедурной переменной процедуры, оператор присваивания -= - для отсоединения. Подпрограммы вызываются в порядке присоединения. Например:
procedure mult2(var r: real);