- •Программирование и алгоритмические языки. Курс за третий семестр. Введение в объектно-ориентированное программирование (ооп)
- •Именование типов в Object Pascal Тип данных «класс»
- •Инкапсуляция
- •Представление данных Данные как функции доступа Свойства
- •Иерархия типов Наследование реализации Проблемы наследования
- •Полиморфизм
- •Проблема множественности иерархий Агрегирование
- •Абстрактные методы и именованные интерфейсы
- •Описание сложного поведения
- •Эволюция пользовательского интерфейса
- •Автоматные модели описания поведения Сложное поведение как изменчивое поведение
- •Программы как символьные преобразования Алфавит как тип данных
- •Программы как синхронные преобразования
- •Тривиальное поведение
- •Нетривиальное поведение
- •Интеллект как рефлексивное, самоопределяемое поведение Машины Тьюринга
- •События как предикаты
- •Событийно управляемое исполнение программ в ооп Программы как тип данных
- •События конечного пользователя и системные, внешние и внутренние
- •Обработка исключений Делегирование
- •Живые данные
- •Задача (проблема) многих тел
- •События как исключения Исключения как события Обработка исключений в Delphi
События как исключения Исключения как события Обработка исключений в Delphi
Что такое ошибка? Содержательно, это исключение из правил, выдача желаемого за действительное, вещь в программировании неизбежная по определению. С формальной стороны, ошибку всегда можно трактовать как вычисление функции вне области определения.
Любая процедура имеет два результата: желаемый и error.
P
X P(X)
error
Рассмотрим контекст до операционной среды, в которой работает программа – Паскаль-машина. Эта машина не делает ошибок (в идеале), все её функции всюду определены. С точки зрения этой машины, наличие ошибочной ситуации, ошибки времени выполнения – есть фиксация типа ошибки, выдача соответствующего сообщения и передача управления Паскаль-машине в качестве обработчика ошибок.
P
Паскаль-машина
(процедуры обработки исключений)
С другой стороны, сама программа есть входной аргумент Паскаль-машины, инструкция для неё. Нетрудно расширить эти инструкции собственными операторами перехвата и обработки исключений.
Синтаксис. 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).