Исключения и их обработка

Мы уже обращали внимание на ошибки, возникающие в процессе выполнения программы, на так называемые исключения (с. 13). Это динамические ошибки, причиной которых чаще всего являются недопустимые исходные данные для совершаемых операций. При выполнении программы такие ошибки вызывают генерацию средой объектов специального вида, характеризующих возникшую исключительную ситуацию. Сразу после их обработки соответствующими процедурами объекты-исключения уничтожаются. Если исключение нигде в программе не перехвачено для адекватной обработки (как это сделать, будет сказано ниже), то оно вызывает стандартную реакцию с выдачей на экран сообщения. После запуска содержащей ошибки программы на выполнение командой Run/Run (<F9>) Debugger (отладчик) выведет сообщение об этой ошибке. Применительно к

 
 

примеру, рассмотренному на с. 43, может выводиться следующее окно с сообщением о том, что '11 ' не является целым числом. Окно не выводится, если стоял флажок Ignore this exception type (Игнорировать этот тип исключения) или сделана настройка в среде, а сразу появится окно, представленное справа. Это же окно появится при нажатии кнопки Continue (Продолжить) в диалоге с отладчиком, т.к. выполнение приложения будет продолжено, что приведет к исключительной ситуации. Щелчок по кнопке Break прерывает работу программы и открывает окно с кодом, в котором активна (выделена) строка, при выполнении которой произошло исключение.

Теперь о том, как избежать описанной нежелательной ситуации. Генерируемые в случае ошибок исключения могут обрабатываться с помощью блока try … except. Блок имеет следующую конструкцию:

try

< Исполняемые операторы >

except

< Операторы, исполняемые при генерации исключения >;

end;

Операторы блока except выполняются только в случае генерации исключения в операторах блока try. В разделе except можно предусмотреть обработку разных типов возникающих исключительных ситуаций с помощью оператора:

on < Класс исключения > do < Оператор >;

Таблицы классов исключений, базовым для которых служит класс Exception, приведены в [1, 3]. Рассмотрим простой пример возможной обработки некоторых исключений.

var

A, B, q : real;

begin

try

A := StrToFloat(Edit1.Text); // Возможен ввод с разделяющей точкой

B := StrToFloat(Edit2.Text);

q := sqrt(A/B); // Возможно деление на ноль

Edit3.Text := FloatToStr(q);

except

on EConvertError do ShowMessage('Неверный ввод данных');

on EZeroDivide do ShowMessage('Деление на ноль');

end;

end;