Delphi дает возможность запрограммировать обработку исключений с помощью специальных конструкций защищенного блока (try–конструкции), которые предназначены для обработки исключительных ситуаций (исключений), возникающих при некорректных действиях программы: например, в случае деления на ноль, при попытке открыть несуществующий файл, при выходе за пределы выделенной области динамической памяти и т.д.
В Delphi для контроля и обработки исключительных ситуаций предусмотрены две конструкции защищенного блока: try..exceptи try..finally.
try{защищенный блок}
<выполняемые_операторы>
except{блок обработки исключений}
onТипИсключения1 doоператор_обработки1;
onТипИсключения2 do оператор_обработки2;
...
onТипИсключенияN do оператор_обработкиN;
Else
<операторы_обработки_остальных_исключений>
end;
try{защищенный блок}
<выполняемые_операторы>
finally{заключительный блок операторов}
<заключительные_операторы>
end;
где <выполняемые_операторы> – операторы, размещенные в секции try..except, выполнение которых может вызвать исключительную ситуацию;
except – ключевое слово, обозначающее начало секции обработки исключений;
else– ключевое слово, за которым следуют операторы, обеспечивающие обработку исключений, тип которых не указаны в секции except.
Защищенный блок начинается зарезервированным словом try (попытаться) и завершается словом end. Конструкции защищенного блока: try..exceptи try..finallyотличаются способом обработки исключения.
В блоке except выполнение происходит следующим образом:
1. Выполняются <выполняемые_операторы> в защищенном блоке – секции try..except.
2. Если <выполняемые_операторы> выполнены без возникновения исключительной ситуации, работа защищенного блока на этом прекращается, и управление получает оператор, стоящий за end.
3. Если при выполнении <выполняемых_операторов> возникло исключение, то управление получает соответствующий обработчик в блоке обработки исключенийexcept, а если для возникшего типа исключений в блоке except обработчик не предусмотрен, то выполняются <операторы_обработки_осталь-ных_исключений>, стоящие за словом else. Если для возникшего типа исключений в блоке except обработчик не предусмотрен, и нет блока else, то выполняется стандартная процедура обработки данного типа исключений.
В блоке try..finallyоператоры в заключительном блоке операторов – секции finally..end получают управление всегда, независимо от того, возникло ли исключение при выполнении <выполняемых_операторов> в защищенном блоке try..finally или нет. Если исключение возникло, то все операторы в секции try..finally, стоящие за оператором, в котором произошло исключение, пропускаются, и выполняются <заключительные_операторы> в заключительном блоке операторов. Если исключения не было, то после выполнения всех <выполняемых_операторов> будут выполнены <заключительные_опера-торы>.
Например, для рассмотренного выше примера расчета частного двух чисел можно воспользоваться конструкцией try..except:
Var
a,b:integer;
c:real;
Begin
write(’Введите число a:’); readln(a);
write(’Введите число b:’); readln(b);
Try
c:=a/b;
Except
onEZeroDivide do
Begin
writeln(’Ошибка! Деление на ноль!’);
c:=0;
end;
end;
write(’Результат a/b=’,c:7:4);
End.
Примечание
При каждом исключении среда Delphi перехватывает управление программой. В этом случае бывает полезно отменить такое поведение среды. Для этого в меню Tools | Debugger Options на странице Languaqe Exception необходимо убрать флажок в переключателе Stop on Delphi Exceptions (в ранних версиях Delphi опция меню Tools | Environent Options и на странице Preference убрать флажок в переключателе Break on exception).
Если в программе важен лишь сам факт возникновения исключения и несущественен его тип, то в try-конструкции вместо обработчиков той или иной ошибки в секции except..end можно разместить общие операторы реакции на любую ошибку. Например,
Var
a,b:integer;
c:real;
Begin
write(’Введите число a:’); readln(a);
write(’Введите число b:’); readln(b);
Try
c:=a/b;
Except
writeln(’Ошибка! Деление на ноль!’);
c:=0;
end;
write(’Результат a/b=’,c:7:4);
End.
Защищенные блоки, как и составные операторы, могут вкладываться друг в друга на неограниченную глубину.
В некоторых ситуациях бывает необходимо инициировать собственное исключение. Для этого пользуются зарезервированным словом raise(возбудить). Если raiseвстретилось в секции try..except или try..finally, то немедленно начинают свою работу секции соответственно except..end и finally..end. Если оно встретилось в except..end или finally..end, то считается, что данный защищенный блок на текущем уровне вложенности завершил свою работу и управление передается вышестоящему уровню.
За информацией о типах исключений обращайтесь к справочной службе Delphi.
Рекомендуемая литература
1. Вирт Н. Алгоритмы и структуры данных / Пер. с англ. – М.: Мир, 1989. - 360 с.
2. Гринзоу Лу. Философия программирования для Windows 95/NT / Пер. с англ. – СПб.: Символ-Плюс, 1997. – 640 с.
3. Зелковиц М., Шоу А., Гэннон Дж. Принципы разработки программного обеспечения / Пер. с англ. – М.: Мир, 1982. – 386 с.
4. Практическое руководство по программированию / Пер. с англ. Б. Мик, П. Хит, Н. Рашби и др.; под ред. Б. Мика, П. Хит, Н. Рашби. – М.: Радио и связь, 1986. – 168 с.
5. Фокс Дж. Программное обеспечение и его разработка / Пер. с англ. – М.: Мир, 1985. - 368 с.
6. Язык компьютера. Пер. с англ, под ред. и с предисл. В. М. Курочкина. – М.: Мир, 1989. - 240 с.
7. Баас Р., Фервай М., Гюнтер Х. Delphi 4: полное руководство: пер. с нем. – К.: Издательская группа BHV, 1998. – 800 с.
8. Архангельский А.Я. Программирование в Delphi 5. – М.: Бином, 2000.- 1072 с.
9. Архангельский А.Я. Delphi 6. Справочное пособие. – М.: Бином, 2001.- 1024 с.
10. Архангельский А.Я. Язык Pascal и основы программирования в Delphi. – М.: Бином, 2004.- 495 с.
11. Архангельский А.Я. Программирование в Delphi 7. – М.: Бином, 2005.- 1152 с.
12. Архангельский А.Я. Delphi 2006: Справочное пособие: Язык Delphi, классы, функции Win32 и NET. – М.: Бином, 2006.- 1152 с.