Оператор try ... except
Оператор 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;