Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
1
Добавлен:
14.04.2019
Размер:
181.25 Кб
Скачать

События как исключения Исключения как события Обработка исключений в Delphi

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

Любая процедура имеет два результата: желаемый и error.

P

X P(X)

error

Рассмотрим контекст до операционной среды, в которой работает программа – Паскаль-машина. Эта машина не делает ошибок (в идеале), все её функции всюду определены. С точки зрения этой машины, наличие ошибочной ситуации, ошибки времени выполнения – есть фиксация типа ошибки, выдача соответствующего сообщения и передача управления Паскаль-машине в качестве обработчика ошибок.

P

Паскаль-машина

X P(X)

(процедуры обработки исключений)

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

Синтаксис. try P except PEH  if Error then PEH else P

(Сравни понятие транзакции в СУБД)

Как правило, процедура PEH имеет вид:

on ErrorType1 do HandleErrType1

***************

on ErorTypeN do HandleErrTypeN

else (тип ошибки)

Ключевые слова: on, do, else. Остальное: вызов пользовательских процедур.

Примеры.

1) try

assign(f,’f.txt’); {В Delphi это называется AssignFile (моё личное)}

reset(f)

except

on eInOutErr do ShowMessage(‘Файл не найден’);

2) плохой пример

try

z:=x/y

except ShowMessage(‘Ой! Поделили на ноль’);

Замечание. В языках, рассчитанных на интерпретацию, сопоставление типов и обработчиков является упреждающим (например, в Basic).

Та же самая конструкция является оператором, который управляет поведением программы в случае будущих ошибок.

on eInOutErr do ShowMessage

assign(f,’f.txt’);

reset(f);

(Смотри варианты отношения к делегированию).

В таких языках предусматривается возможность повторного выполнения после исправления ошибки. В языках компилируемого типа та же ситуация реалихзуется циклом (пока не завершили безошибочно).

Что делать, когда не видно метода обработки, исправления ошибки?

Как минимум, завершить процедуру с наименьшими потерями, в идеале, деинициализировать, сделать откат, не навредить (снова вспомни понятие транзакции).

try P

finally Pfin

Процедура Pfin отрабатывает в любом случае, вне зависимости от того, произошла ошибка или нет (сравни: секция финализации в модульном программировании и деструкторы в объектах).

К сожалению, в Паскале опции except и finally не могут комбинироваться. Требуется явная регенерация ошибки. В терминах ООП тип ошибки есть класс. В Object Pascal это любой класс, потомок класса Exception в модуле SysUnits. Это открывает путь для определения пользовательских, специфичных для логики данной задачи, исключений.

eCrocodileIsNill=class(Exception);

eNoFood=class(Exception)

begin

try {попытайся накормить крокодила}

except

on eCrocodileIsNill do Heat;

on eNoFood do GetFood;

Полный синтаксис опции on: on eErrorType do PEH(i);

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

Синтаксис. Raise=(объект класса Exception)

Семантика. Error:=Exception.Create

{exit}

Примечание. В Basic тот же синтаксис используется для порождения любого события.

Прагматика. Когда этим пользоваться?

Использование обработчиков исключений, как и любых других событий, предполагает явно или неявно деление «клиент-сервер». Идея проста: каждый старается не делать собственных ошибок и обрабатывает чужие. Точнее: сервер обрабатывает ошибки пользователя, а если не может, возвращает их ему.

Лекции читал: Бухараев Н.Р.

Набрал: Иванов Нияз (гр. 9109).

20