Предотвращение и обработка ошибок

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

Нарушение в работе программы называется исключением. Обработку исключений (ошибок) берет на себя автоматически добавляемый в выполняемую программу код, который обеспечивает, в том числе, вывод информационного сообщения. Вместе с тем Delphi дает возможность программе самой выполнить обработку исключения.

Инструкция обработки исключения в общем виде выглядит так:

try

// здесь инструкции, выполнение которых может вызвать исключение

except // начало секции обработки исключений

on ТипИсключения1 do Обработка1;

on ТипИсключения2 do Обработка2;

on ТипИсключенияJ do ОбработкаJ;

else

// здесь инструкции обработки остальных исключений

end;

где:

- try — ключевое слово, обозначающее, что далее следуют инструкции, при выполнении которых возможно возникновение исключений, и что обработку этих исключений берет на себя программа;
- except — ключевое слово, обозначающее начало секции обработки исключений. Инструкции этой секции будут выполнены, если в программе возникнет ошибка;
- on — ключевое слово, за которым следует тип исключения, обработку которого выполняет инструкция, следующая за do;
- else — ключевое слово, за которым следуют инструкции, обеспечивающие обработку исключений, тип которых не указаны в секции except.

Как было сказано выше, основной характеристикой исключения является его тип. В таблице 13.1 перечислены наиболее часто возникающие исключения и указаны причины, которые могут привести к их возникновению.

Таблица 13.1. Типичные исключения

| Тип исключения | Возникает |
| EZeroDivide | При выполнении операции деления, если делитель равен нулю |
| EConvertError | При выполнении преобразования, если преобразуемая величина не может быть приведена к требуемому виду. Наиболее часто возникает при преобразовании строки символов в число |

| Тип исключения | Возникает |
| EFilerError | При обращении к файлу. Наиболее частой причиной является отсутствие требуемого файла или, в случае использования сменного диска, отсутствие диска в накопителе |

Следующая программа, вид диалогового окна которой приведен на рис. 13.3, а текст— в листинге 13.1, демонстрирует обработку исключений при помощи инструкции try.

Рис. 13.3. Диалоговое окно программы

Листинг 13.1. Обработка исключения типа EZeroDivide

unit UsTry_;

interface

uses

Windows, Messages, SysUtils, Classes,

Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Editl: TEdit; // напряжение

Edit2: TEdit; // сопротивление

Label5: TLabel; // результат расчета - ток

Button1: TButton; //кнопка Вычислить

procedure ButtonlClick(Sender: TObject);

private

{ Private declarations )

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

var

u: real; // напряжение

r: real; // сопротивление

i: real; // ток

begin

Labels.Caption := ' '; try

// инструкции, которые могут вызвать исключение (ошибку)

u := StrToFloat(Edit1.Text);

r := StrToFloat(Edit2.Text);

i := u/r;

except // секция обработки исключений

onEZeroDivide do // деление на ноль

begin

ShowMessage('Сопротивление не может быть равно нулю!');

exit;

end;

on EConvertError do // ошибка преобразования строки в число

begin

ShowMessage('Напряжение и сопротивление должны быть ' +

'заданы числом. ' +#13+

'При записи дробного числа используйте запятую.';

exit;

end;

end;

Label5.Caption := FloatToStr(i) + ' A';

end;

end.

В приведенной программе исключения могут возникнуть при вычислении величины тока. Если пользователь задаст, что сопротивление равно нулю, то при выполнении инструкции i:=u/r возникает Исключение EZeroDivide.

Если неверно будет введено числовое значение, например, для разделения целой и дробной частей числа вместо запятой будет использована точка, то возникнет исключение типа EConvertError. Оба исключения обрабатываются одинаково: выводится сообщение, после чего процедура обработки события Onclick завершает свою работу.