Материал: Лабораторная работа №12 Обработка ошибок

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

Класс

Родительский

Описание

исключения

класс

 

EAccessViolation

Exception

Программа пыталась обратиться к не

 

 

принадлежащей ей области памяти или использует

 

 

недействительный указатель.

EControlC

Exception

Возникает при нажатии Ctrl-C при работе

 

 

приложения в режиме консоли.

EConvertError

Exception

Ошибка преобразования в функциях StrToInt или

 

 

StrToFloat.

EDivByZero

EIntError

Ошибка целочисленного деления на ноль

EFCreateError

EStreamError

Ошибка при создании файла. Например, попытка

 

 

создать файл на устройстве, предназначенном

 

 

только для чтения, или в несуществующем каталоге.

EFOpenError

EStream-Erro

Ошибка открытия потока данных. Например,

 

 

попытка открыть несуществующий файл.

EInOutError

Exception

Любая ошибка в файловых операциях. Поле

 

 

ErrorCode объекта этого класса содержит код

 

 

ошибки.

EIntError

Exception

Любая ошибка в целочисленных вычислениях.

EInvalidCast

Exception

Программа пытается осуществить недопустимое

 

 

преобразование типов с помощью оператора as.

EInvalidOp

EMatchError

Ошибка в операциях с плавающей точкой

 

 

(недопустимая инструкция, переполнение стека

 

 

сопроцессора и т.п.).

EMatchError

Exception

Любая ошибка при выполнении вычислений с

 

 

плавающей точкой.

EOutOfMemory

Exception

Эта ошибка возникает, когда программа

 

 

запрашивает слишком большой для данной

 

 

конфигурации Windows объем памяти.

EOverflow

EMatchError

Результат операций с плавающей точкой слишком

 

 

велик, чтобы уместиться в регистрах сопроцессора.

EWriteError

EFilerError

Ошибка записи в поток данных.

EZeroDivide

EMatchError

Вещественное деление на ноль.

 

 

 

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

например, в списке первым стоит EAbort, который может обработать любое исключение, ни один из стоящих за ним обработчиков никогда не получит управления. Точно так же, если указан обработчик для класса EIntError, за ним бесполезно размещать обработчики

EDivByZero, ERangeError или EIntOverflow:

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

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

try

...

except

...

on E: EClassName do ; writeln(E.Message);

...

end;

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

Создание собственного класса исключений

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

type EMyError=class(Exception);

Совет: В Delphi принято для имен классов исключений использовать префикс «E». Рекомендуется при создании собственных классов исключений руководствоваться этим же принципом. Примеры имен классов исключений можно посмотреть в таблице 1.

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

(EMyError).

Листинг 3

program Myexp;

{$APPTYPE CONSOLE}

uses SysUtils;

// класс исключения

type EMyError=class(Exception);

function Calculate(X:real):real; begin

if 1-x*x<0 then raise EMyError.Create('Demo MyError'); result:=sqrt(1-x*x);

end;

var value:real; begin

try

write('value > '); readln(value);

writeln('result=', Calculate(Value));

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

except

on Err:EMyError do writeln('Error: ', Err.message); on Err:EInOutError do writeln('Error: ', Err.message);

else

writeln('Unknown Error'); end;

writeln('Press Enter to Exit'); readln;

end.

Задания к лабораторной работе

1.Модифицируйте программы из заданий 2-5 лабораторной работы № 6, добавив проверку на ошибки ввода-вывода с помощью защищенных блоков?

2.Модифицируйте программу из листинга 12 лабораторной работы № 11, добавив проверку на ошибки ввода-вывода с помощью защищенных блоков?

3.Модифицируйте функцию SearchNode из модуля Lists (лабораторная работа № 10) таким образом, чтобы при отрицательном результате поиска ( т.е. заданный элемент в списке не найден) возникала исключительная ситуация ENotFoundError. Модифицируйте также программу из листинга 1 (лабораторная работа № 10) так, чтобы она могла обрабатывать исключительную ситуацию ENotFoundError, а также исключительные ситуации связанные с ошибками ввода-вывода.

Вопросы к лабораторной работе

1.В чем суть механизма обработки исключительных ситуаций?

2.Что такое защищенный блок?

3.Как работает защищенный блок завершения?

4.Как работает защищенный блок исключения?

5.Как программно возбудить исключение?

6.Какие стандартные классы исключений вы знаете?

7.Как создать свой класс исключение?

8.Какой особенностью работы с памятью обладают классы исключений?

9.Как получить доступ к полям и методам класса исключения во время обработки ошибки в секции except end?

10.Какой алгоритм используется при выборе исключения в секции except end?

Справочные таблицы

 

Таблица 1– Стандартные классы исключений...........................................................................

5