Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методическое пособие для самостоятельных работ.doc
Скачиваний:
21
Добавлен:
16.11.2019
Размер:
2.89 Mб
Скачать

I:integer;

begin

try

{Преобразование символьной строки в число, }

{возможна исключительная ситуация}

i:=StrToInt(Edit1.Text);

except {Начинается часть обработки исключительной ситуации}

{выдается сообщение о причине возникновения исключительной ситуации}

ShowMessage ('Вы должны ввести целое число');

Edit1.SetFocus;

{Активным становится окно Edit1 для ввода нового значения }

end;

end;

При запуске этого миниприложения из cреды Delphi обработка исключительной ситуации выполняется самой средой и на экране появится сообщение (рис. 7.2.):

Рис. 7.2. Сообщение об исключительной ситуации

Обратите внимание на последнее предложение в сообщении (Use Step or Run to continue). Если вы закроете окно сообщения и нажмете на функциональную клавишу F7 – Step, то синяя полоса появится на строке программы, которая следует за вызвавшей исключительную ситуацию строкой. Таким образом, легко определить место возникновения исключительной ситуации, а причина видна из сообщения, выданного Delphi. Что случится при нажатии на функциональную клавишу F9 – Run при наличии и отсутствии блока try ¼except? Запустите и попробуйте!

Delphi позволяет создать законченное приложение, которое может быть запущено прямо из операционной системы. Для этого сначала необходимо запомнить файл проекта и файлы всех модулей (Как это делать, было рассмотрено выше) и создать файл с исполняемой программой (*.exe файл). Для создания *.exe файла необходимо выбрать из меню Delphi пункт Project и подпункт Build all. В результате будет создан *.exe файл с тем же именем, которое мы присвоили файлу проекта. При запуске приложения из Windows 95 и наборе неправильных символов в окне редактирования на экране появится сообщение, приведенное на рис. 7.3 и приложение будет ждать ввода нового значения.

Рис. 7.3. Пример обработки исключительной ситуации

Можно возразить, что то же самое достигается применением вместо функции StrToInt( ) процедуры val( ) и условных операторов, но это затрудняет слежение за логикой программы и при наличии большого количества преобразований заметно удлиняет программу.

В Delphi разрешены и вложенные блоки try¼except и try ¼finally. Предлагаем читателю самостоятельно разобраться, как будет работать приведенная ниже процедура при возникновении исключительной ситуации и без этого:

procedure TForm1.Button1Click(Sender: Tobject);

Var

I, j, k : integer;

ptr : pointer;

Begin

i:=0;

j:=0;

GetMem (ptr, 4098);

try

try

k:= j div i;

except

ShowMessage(‘Ошибка деления’);

end;

finally

FreeMem (ptr, 4098);

end;

End;

7.2. Обработка определенных исключительных ситуаций

Причина возникновения исключительных ситуаций может быть самой различной. В больших и сложных программах было бы целесообразно более точно определить причину возникновения исключительной ситуации и сообщить об этом пользователю. При запуске приложения из Delphi это делается автоматически. Обратите внимание на текст сообщения на рис. 7.2.: “Exception class EConvertError with Message ‘ ‘rtrt’ is not a valid integer value’ “. Нам сообщают, что возник класс исключения EConvertError (ошибка преобразования) и это вызвало сообщение о том, что¼

Поставим задачу: обеспечить определение класса исключительной ситуации и при запуске приложения из операционной системы. Некоторые классы исключительных ситуаций Delphi приведены в табл. 7.1. Полный перечень можете узнать традиционным способом.

Таблица 7.1

Класс ИС

Описание

EBreakPoint

В программе имеется точка прерывания

EConvertError

Ошибка преобразования (см. последний пример)

EDivByZero

Деление целого числа на нуль

EInOutError

Ошибка файлового ввода/вывода

EIntOverFlow

Переполнение целочисленного значения

EInvalidCast

Недопустимое приведение типов

EInvalidOp

Недопустимая математическая операция с плавающей точкой

EOutOfMemory

Невозможно выделить память требуемого объема

EOverflow

Переполнение значения с плавающей точкой

ERangeError

Значение за пределами диапазона допустимых значений

EUnderflow

Потеря значимости в выражении с плавающей точкой (слишком малое значение)

EZeroDivide

Деление числа с плавающей точкой на нуль

Для иллюстрации рассмотрим простую программу с преобразованиями и вычислениями. Приложение содержит одну форму и два модуля. Для экономии места приведем лишь реализацию кнопки запуска вычислений и полностью модуль вычислений. Остальное читателю должно быть понятно из предыдущего изложения:

procedure TForm1.Button1Click(Sender: TObject);

Var

Res :real;

Rida :string;

begin

{Вызов процедуры, передача исходных данных, получение результата}

mina(Edit1.Text,Edit2.Text,Edit4.Text,res);

{Вывод результата}

rida:=FloatToStr(res);

Edit3.Text:=rida;

end;

unit mod2;

interface

procedure mina(s1,s2,s3:string; var r:real);

implementation

{Для обеспечения вызова стандартных процедур и функций}

uses SysUtils, Dialogs;

procedure mina(s1,s2,s3:string; var r:real);