Материал: Мансуров. Основы программирования в среде Lazarus. 2010

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

но возникновение исключений. После except следуют операторы, которые образуют секцию обработки исключений. Признаком конца секции служит ключевое слово end. Внутри секции программист указывает классы исключе-

ний (говорят еще типы исключений) после слова on, а затем после ключевого слова do оператор обработки исключения, причем оператор может быть со-

ставным. После необязательного else следуют операторы обработки исклю-

чений, не вошедшие в перечень on. Если программисту нужно только устано-

вить сам факт исключения, независимо от типа, то он может просто записать обработчик исключения после слова except.

Вторая конструкция имеет вид:

try

<Потенциально "опасные" операторы, при выполнении которых могут возникнуть исключительные ситуации >

finally

<операторы, которые должны быть выполнены в любом случае, незави-

симо от того, произошло исключение или нет >

end;

В чем их различие? В конструкции try..except если при выполнении операторов секции try возникло исключение, то управление передается в сек-

цию except, где и происходит обработка исключения. Если же исключения не произошло, то операторы блока except просто пропускаются. В конструкции try..finally операторы будут выполнены независимо от того, произошло исключение или нет.

Рассмотрим пример:

try

num:=StrToInt(Stroka);

521

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

except

on EConvertError do

ShowMessage('Ошибка преобразования строки в целое число');

end;

Здесь сообщение будет выведено только в том случае, когда невозможно преобразование строки символов в целое число, то есть когда возникнет ис-

ключение EConvertError.

Конструкции try..except и try..finally могут быть вложены друг в друга на неограниченную глубину. Рассмотрим реализацию примера с файлом.

Procedure Test; var

F: TextFile; number: integer; s: string;

begin

AssignFile(F, 'Data.txt');

Rewrite(F);

s:= '12#4';

// В файл намеренно записывается

Writeln(F, s);

// ошибочная строка символов

Reset(F);

 

try

// начало секции (блока) try..except

Readln(F, s);

 

try

// начало секции try..finally

number:= StrToInt(s);

finally

CloseFile(F); // эти два оператора будут выполнены

522

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

DeleteFile('Data.txt'); // в любом случае

end; // конец секции try..finally

except

on EConvertError do

ShowMessage('Ошибка преобразования'); end; // конец секции try..except

end;

Вернемся к примеру, в котором осуществляется ввод двух целых чисел и выполняются четыре арифметических действия (сложение, вычитание, умно-

жение и деление нацело), рис. 6.30. Модифицируем программу, добавив в него обработку исключений. Перепишите обработчики события OnKeyPress для

LabeledEdit1 и событий OnClick кнопок SpeedButton1, SpeedButton2, SpeedButton3 и SpeedButton4 в виде:

procedure TForm1.LabeledEdit1KeyPress(Sender: TObject; var Key: char);

begin

if Key = #13 then begin

try StrToInt(LabeledEdit1.Text);

except

on EConvertError do begin

ShowMessage('Ошибка преобразования! Вероятно, ' +

'Вы ошиблись при вводе числа');

exit;

end;

523

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

end;

LabeledEdit2.SetFocus; SpeedButton1.Down:= false; SpeedButton2.Down:= false; SpeedButton3.Down:= false; SpeedButton4.Down:= false; exit;

end;

end;

procedure TForm1.SpeedButton1Click(Sender: TObject); begin

try LabeledEdit3.Text:=IntToStr(StrToInt(LabeledEdit1.Text)

+ StrToInt(LabeledEdit2.Text));

except

on EConvertError do begin

ShowMessage('Ошибка преобразования! Вероятно, ' + 'Вы ошиблись при вводе второго числа');

exit;

end;

end;

StatusBar1.SimpleText:= 'Сложение';

LabeledEdit1.SetFocus;

LabeledEdit1.SelectAll;

end;

procedure TForm1.SpeedButton2Click(Sender: TObject);

524

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

begin try

LabeledEdit3.Text:=IntToStr(StrToInt(LabeledEdit1.Text)

- StrToInt(LabeledEdit2.Text));

except

on EConvertError do begin

ShowMessage('Ошибка преобразования! Вероятно, ' + 'Вы ошиблись при вводе второго числа');

exit;

end;

end;

StatusBar1.SimpleText:= 'Вычитание';

LabeledEdit1.SetFocus;

LabeledEdit1.SelectAll;

end;

procedure TForm1.SpeedButton3Click(Sender: TObject); begin

try LabeledEdit3.Text:=IntToStr(StrToInt(LabeledEdit1.Text)

* StrToInt(LabeledEdit2.Text));

except

on EConvertError do begin

ShowMessage('Ошибка преобразования! Вероятно, ' +

'Вы ошиблись при вводе второго числа');

exit;

end;

525

Смотрите также:

11 Горм +
113
14
1433
1511
1632
199
204
2N4264RE
3773