logo
Posobie_Ravino_Atamanov

2.5.5.3. Структурная обработка исключительных ситуаций

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

Исключительная ситуация (exception) – это состояние, возникающее в процессе выполнения программы из-за любых ошибок или ошибочных условий.

Хорошая программа должна работать безошибочно, без зацикливания и зависания.

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

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

Рисунок 7 ‑ возникновение исключительной ситуации

Структурная обработка исключительных ситуаций ‑ это совокупность операторов, позволяющих программисту, когда возникает ошибка (исключительная ситуация), связаться с кодом программы, подготовленным для обработки такой ошибки. Такая совокупность операторов как бы «охраняет» фрагмент кода программы и определяет обработчика ошибки, который вызывается, если что-то происходит не так в «охраняемом» участке кода.

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

try..except и

try..finally

Первый тип используется для обработки исключительных ситуаций. Его синтаксис:

try

Statement 1;{защищенные от ошибок операторы}

Statement 2;

...

except

on Exception 1 do Statement; {операторы обработки исключительной ситуации}

on Exception 2 do Statement;

...

else

StatementN; {обработка всех остальных ошибок (обработчик по умолчанию)}

end;

Для уверенности в том, что ресурсы, занятые приложением, освободятся в любом случае, можно использовать конструкцию второго типа. Код, расположенный в части finally, выполняется в любом случае, даже если возникает исключительная ситуация. Соответствующий синтаксис представлен ниже:

try

Statement1; {защищенные от ошибок операторы}

Statement2;

...

finally

StatementN; {эти операторы всегда выполняются}

end;

Исключительные ситуации в Delphi описываются классами. Каждый класс соответствует определенному типу исключительных ситуаций. В то время, когда в программе возникает исключительная ситуация, создается объект соответствующего класса, который переносит информацию об этой ситуации из места возникновения в место обработки.

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

Пример использования в программе

//Необходимо ввести массу машины

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

Massa:=StrToFloat(Edit1.Text); {считываются данные из компонента Edit1}

except

on EConvertError Do {ошибка преобразования строки}

begin

MessageDlg('Некорректно введены данные', mtWarning,[mbOK],0);

{сообщение о неверном вводе данных}

Edit1.SetFocus; {передача фокуса компоненту в котором были введены неверные данные}

Exit;

end;

end; {Конец блока обработки исключительной ситуации}

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

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

If (Massa<=1000) or (Massa>10000) Then

begin

MessageDlg('Значение массы машины должно находиться '

+'в пределах от 1000 до 10000 кг',

mtWarning,[mbOK],0);

Edit1.SetFocus; {передача фокуса компоненту в котором были введены неверные данные}

Exit;

end;

В приложении 11 представлены классы исключительных ситуаций и их описание.