Оператор try ... except имеет вид:
tryоператоры
exceptблок обработки исключений
end;
Блок try называется
защищаемым блоком.
Если при выполнении программы в нем происходит ошибка, то он завершается и
выполнение передается блоку except. Если исключение
обрабатывается в блоке except, то после его обработки
программа продолжает выполняться с оператора, следующего за try ...
except ... end. Если исключение остается необработанным и имеется объемлющий
блок try, то выполнение передается
его блоку except. Если объемлющего
блока try нет, то программа
завершается с ошибкой. Наконец, если в блоке try
ошибки не произошло, то блок except
игнорируется и выполнение программы продолжается дальше.
Если в процессе обработки исключения (в блоке
except) произошло другое исключение, то текущий
блок except завершается, первое
исключение считается необработанным и обработка нового исключения передается
объемлющему блоку try. Таким образом,
в каждый момент времени существует максимум одно необработанное исключение.
Блок обработки исключений представляет собой либо последовательность операторов, разделенных точкой с запятой, либо последовательность обработчиков исключений вида
onимя:типdoоператор
Обработчики разделяются символом ';',
после последнего обработчика также может следовать символ ';'.
Здесь тип - тип исключения
(должен быть производным от стандартного типа Exception),
имя - имя переменной исключения (имя с последующим двоеточием может быть
опущено). В первом случае при обработке исключения выполняются все операторы из
блока except. Во втором случае среди
обработчиков осуществляется поиск типа текущего исключения (обработчики
перебираются последовательно от первого до последнего), и если обработчик
найден, то выполняется соответствующий оператор обработки исключения, в
противном случае исключение считается необработанным и передается объемлющему
блоку try. В последнем случае после всех
обработчиков on может идти ветвь else,
которая обязательно обработает исключение, если ни один из обработчиков не
выполнился.
Следует обратить внимание, что имя переменной исключения в разных обработчиках может быть одинаковым, т.е. оно локально по отношению к обработчику.
Поиск типа исключения в обработчиках производится с учетом
наследования: исключение будет обработано, если оно принадлежит к указанному в
обработчике типу или производному от него. Поэтому принято записывать вначале
обработчики производных классов, а затем - обработчики базовых (в противном
случае обработчик исключения производного класса никогда не сработает).
Обработчик исключения 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;