Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лекции delphi 1часть

.pdf
Скачиваний:
64
Добавлен:
16.03.2015
Размер:
814.86 Кб
Скачать

begin

a:=strtoint(Edit1.Text);

b:=strtoint(Edit2.Text);

rez:=a/b;

Edit3.Text:=floattostr(rez);

Memo1.Lines.Add(Edit1.Text);

Memo1.Lines.Add(Edit2.Text);

Memo1.Lines.Add(inttostr(a+b));

Memo1.Lines.Add(floattostr(rez));

end;

Во время работы приложения исключительные ситуации могут возникнуть при выполнении преобразования строка-число и при вычислении частного от деления, если делитель равен нулю или нулю равны оба введённых числа. Если запустить программу на выполнение, то при возникновении любого из исключений сработает глобальная система обработки исключительных ситуаций. При этом выполнение процедуры будет прервано и будут выводиться сообщения о причине ошибки.

Введём локальную обработку исключительных ситуаций. Для этого сформируем защищённый блок. Анализировать ошибки не будем.

procedure TForm1.Button1Click(Sender: TObject);

Var a,b:integer;

rez:extended;

begin

try

a:=strtoint(Edit1.Text);

b:=strtoint(Edit2.Text);

rez:=a/b;

Edit3.Text:=floattostr(rez);

except

ShowMessage('Ошибка!');

end;

Memo1.Lines.Add(Edit1.Text);

Memo1.Lines.Add(Edit2.Text);

Memo1.Lines.Add(inttostr(a+b));

Memo1.Lines.Add(floattostr(rez));

end;

В этом случае при возникновении любого исключения будет прерываться выполнение операторов защищённого блока, в Edit3 результат не появится. На экран будет выведено окно с сообщением «Ошибка!». Операторы, расположенные после защищённого блока, будут выполняться, то есть в Memo1 появятся записи.

Изменим секцию except. Проверим одну из возможных ошибок – деление на ноль.

Далее приводится фрагмент кода, в который внесены изменения.

except

on EZeroDivide do

begin

ShowMessage('Попытка деления на ноль!');

Edit2.SetFocus;

end;

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

Добавим локальный обработчик для контроля над преобразованием вводимых данных. При этом глобальная обработка исключений будет задействована только для нулевых введённых значений (0/0).

except

on EZeroDivide do

begin

ShowMessage('Попытка деления на ноль!');

Edit2.SetFocus;

end;

on EConvertError do ShowMessage('Ошибка преобразования!');

Если ввести секцию else, то все исключения будут обработаны локально.

except

on EZeroDivide do

begin

ShowMessage('Попытка деления на ноль!');

Edit2.SetFocus;

end;

on EConvertError do ShowMessage('Ошибка преобразования!') else ShowMessage('Ошибка в защищённом блоке!');

Конструкцию try...finally используют в тех случаях, когда существуют действия,

которые обязательно надо выполнить до завершения программы. Код, расположенный в

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

try

...{Операторы, выполнение которых может вызвать ошибку}

finally

{Операторы, которые должны быть выполнены даже в случае ошибки}

end;

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

Базовым классом для всех исключений является класс Exception. Потомки этого класса охватывают большое количество исключений, которые могут возникнуть в процессе работы приложений. Имена потомков класса Exception начинаются с буквы E.

Ниже приведены наиболее часто используемые классы исключений.

EConvertError – ошибка преобразования типов, может возникнуть при выполнении функций StrToInt и StrToFloat.

EInOutError – ошибка ввода/вывода при включенной директиве {$I+}.

EDivByZero – деление целого на ноль.

EIntOverflow – переполнение в операции с целыми переменными.

ERangeError – присвоение значения, выходящего за пределы допустимого диапазона. Например, при попытке обращения к элементам массива по индексу,

выходящему за пределы массива.

EInvalidGraphic – попытка загрузки методом LoadFromFile файла, несовместимого графического формата.

EInvalidPointer – некорректная операция с указателем.

EFCreateError – ошибка создания файла

EFOpenError – ошибка открытия файла

EListError, EStringListError – ошибка при работе со списками.

EMathError – предок исключений, возникающих при выполнении операций с плавающей точкой.

EInvalidOp – попытка передачи математическому сопроцессору ошибочной инструкции.

EOverflow –переполнение при слишком больших величинах.

EUnderflow – потеря значимости при операции с плавающей точкой (слишком малая величина). Результат получает нулевое значение.

EZeroDivide – попытка деления на ноль.

EMenuError –ошибка при работе с пунктами меню для компонент TMenu,

TMenuItem, TPopupMenu и их наследников.

EOutOfMemory – вызов методов New, GetMem или конструкторов классов при невозможности распределения памяти.

EOutOfResources – ошибка при выполнении запроса на выделение или заполнение

Windows-ресурсов (например, обработчика handles).

Структурную обработку исключительных ситуаций, реализованную в Delphi, можно дополнять традиционным подходом к обработке ошибок, который заключается в анализе кодов ошибок, возвращаемых функциями.