Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по курсу.docx
Скачиваний:
107
Добавлен:
24.02.2016
Размер:
2.8 Mб
Скачать

6.6. Инициирование собственных исключительных ситуаций

Возникновение исключительной ситуации может быть инициировано самим разработчиком программы для обработки некоторых «своих» ситуа­ций. Для этого имеется три оператора.

Во-первых, процедура Abort вставленная в нужном месте раздела try генерирует ситуацию типа EAbort. В отличие от Break и Exit, она позволяет, например, осуществить выход из глубоко вложенных циклов и процедур.

Во-вторых, процедура Assert (B:Boolean; [const st:String]), генерирует исключительную ситуацию типа EAssertionFailed если результат логического выражения B=false, при этом возможна выдача в диалоговое окно сообщения, помещенного в St (этот аргумент может отсутствовать).

В-третьих, ключевое слово

raise <тип исключения>. create ('текст сообщения'),

генерирует исключительную ситуацию указанного типа и выдает сооб­щение.

6.7. Примеры фрагментов программ

В дополнение к этой теме приведем две функции, позволяющие органи­зовать экстренный диалог и управлять ходом вычислений. У Widows имеется набор API-функций (Application Program Interface - интерфейс прикладных программ).

При обработке исключительных ситуаций удобно использовать проце­дуру ShowMessage('Выводимый текст'), которая выводит иконку с текстом. Если она появилась, то будет до конца работать.

Для обеспечения диалога применяется функция: MessageDlg('текст',mtInformaпon,[mbok,mbNov..],0):word, которая, кроме сообщения на иконке имеет заголовок Inf (таких стан­дартных заголовков имеется 9) и еще от одной до 11 кнопок, т.е. главное то, что реализуется остановка и ожидание нажатия кнопки!!! При нажатии на одну из них функция выдает номер соответствующей кнопки (тгОк, mrNo, ...), что можно полезно использовать например с помощью оператора case.

K:=MessageDlg ('значениех<0', mtInformation,[mbok,mbNo,^],0); Case k of

Mrok: <>; MrNo: <>; MrYes: <>; End;

Пример перехвата переполнения: try f:=1;

for i:=2 to 1000 do f:=f*i; except

on EintOverFlow do

ShowMessage('переполнение при i='+intTostr(I)'); end;

Пример обработки файла:

st:=Edit1.text; Assign(f,st);

try reset(f); except rewrite(f); end; try

Работа с файлом: finally

Flush (f); // запись в файл содержимого буфера closefile(f); end;

Программа не будет остановлена, файл будет закрыт.

Пример перехвата деления на нуль внутри цикла

x:=a;

repeat

try

y:=sin(x)/cos(x); except

on EZeroDivide do begin y:=0; MessageDlg('rpi x='+FloattoStr(x),mlEnor? [mbOk? mbNO], 0) of case: MrNo: exit; MrYes:y:=0; End; end;

Writeln(x,y); x=x+h; Until x>b+h/2; end;

Пример создания собственной исключительной ситуации:

try

if x=0 then raise Eabort.Create ('x=0');

Assert(x>0,'x отрицательный'); y:=sgrt(x)-z+5/x;

except

on EAssertionFiled do exit; on Eabort do Exit; end;

Пример программы с обработкой исключительных ситуаций. Про­стейший калькулятор:

*r Исключительные ситуации Г-П[Щ[х'

unit Unitl;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; type

TForm1 = class(TForm) Buttonl: TButton;

Button2: TButton; Button3: TButton; Button4: TButton; BitBtn1: TBitBtn; Edit1: TEdit;

Edit2: TEdit;

Label1: TLabel; Label2: TLabel;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject); private

{ Private declarations } public

{ Public declarations } end;

var Form1: TForm1;

implementation

{$R *.dfm}

{$R+}

procedure TForm1.FormCreate(Sender: TObject); begin

Edit1.Clear;

Edit2.Clear; end;

procedure TForm1.Button1Click(Sender: TObject); var a,b,c:extended; // /

begin

try

a:=StrToFloat(Edit1.text); b:=StrToFloat(Edit2.text);

c:=a/b;

label2.Caption:=FloatToStrf(c,fffixed,8,2);

except

on EZeroDivide do MessageDlg('Нельзя делить на нуль',

mtError,[mbOk],0); on Econverterror do MessageDlg('Проверьте'+

' значения в edit',mtError,[mbOk],0); end; end;

procedure TForm1.Button4Click(Sender: TObject); var a,b,c:byte; // +

begin try

a:=StrToInt(Edit1.text); b:=StrToInt(Edit2.text);

c:=a+b;

label2.Caption:=IntToStr(c); except

on Erangeerror do MessageDlg('Результат выходит за'+ ' пределы диапазона допустимых

значений',mtError,[mbOk],0);

on Econverterror do MessageDlg('Проверьте'+ ' значения в edit',mtError,[mbOk],0); end;

procedure TForm1.Button2Click(Sender: TObject); var a,b,c:byte; // -begin try

a:=StrToInt(Edit1.text); b:=StrToInt(Edit2.text);

c:=a-b;

label2.Caption:=IntToStr(c);

except

on Erangeerror do MessageDlg('Результат выходит за'+ ' пределы диапазона допустимых

значений',mtError,[mbOk],0);

on Econverterror do MessageDlg('Проверьте'+ ' значения в edit',mtError,[mbOk],0); end; end;

procedure TForm1.Button3Click(Sender: TObject);

var a,b,c:byte; // * begin try

a:=StrToInt(Edit1.text); b:=StrToInt(Edit2.text); c:=a*b;

label2.Caption:=IntToStr(c);

except

on ERangeerror do MessageDlg(' Результат выходит за'+ ' пределы диапазона допустимых значений', mtError,[mbOk],0);

on EConverterror do MessageDlg(' Проверьте'+ ' значения в edit',mtError,[mbOk],0);

end; end;

end.