- •Предисловие
- •Введение Эволюция разработки программного обеспечения
- •Технологии программирования
- •Основные понятия объектно-ориентированного программирования
- •Инкапсуляция
- •Свойства
- •Векторные свойства
- •Создание и уничтожение объектов
- •Конструкторы
- •Деструкторы
- •Наследование
- •Свойства
- •Конструкторы и деструкторы класса-предка
- •Полиморфизм, виртуальные и динамические методы
- •Статическое перекрытие виртуальных методов
- •Виртуальное перекрытие конструкторов и деструкторов
- •Абстрактные методы
- •Области видимости
- •Перекрытие и переопределение свойств
- •Перекрытие методов доступа к свойствам
- •Приведение объектных типов, операторы as и is
- •Агрегация
- •События
- •Процедурный тип
- •Создание события
- •Инициаторы события
- •Делегирование
- •Внутреннее устройство объекта
- •Указатели на класс
- •Виртуальные конструкторы
- •Методы класса
- •Обработка исключительных ситуаций
- •Операторы try...Except и try...Finally
- •Исключительные ситуации как объекты
- •Перегрузка методов
- •Перегрузка виртуальных методов
- •Параметры по умолчанию
- •Основы объектно-ориентированного анализа и проектирования
- •Объектно-ориентированная модель
- •Классы и объекты
- •Заключение Применение объектно-ориентированного программирования
- •Библиографический список
-
Обработка исключительных ситуаций
Иногда некоторые операторы в программе приводят к ошибке: деление на ноль, открытие несуществующего файла и т.д. Хотелось бы, чтобы программа при возникновении таких ошибок продолжала функционировать и как-то реагировала на ошибки. Например, сообщала пользователю, что не может записать информацию в файл, т.к. нет места на диске. Этого можно попытаться добиться, сделав каждый оператор условным, но есть более простой путь – структурированная обработка исключительных ситуаций.
Исключительной ситуацией (ИС) называется возникновении ошибки или какого-либо иного события, прерывающего нормальное выполнение программы.
Обработка исключительных ситуаций дает возможность разделить нормальную логику программы и логику работы в случае возникновения исключительных ситуаций.
Операторы try...Except и try...Finally
Для работы с исключительными ситуациями используют специальные конструкции языка – блоки try..except и try..finally. Все ошибки периода выполнения внутри этих блоков будут пойманы и обработаны.
Синтаксис блока try...except следующий:
try <операторы> except on Exception1 do <Оператор> on Exception2 do <Оператор> ... else <оператор> end;
Выполнение блока начинается с секции try. При отсутствии исключительных ситуаций только она и выполняется. Секция except получает управление в случае возникновения ИС. Обработчик ИС состоит из набора директив on...do, определяющих реакцию приложения на определенную ситуацию. Каждая директива связывает конкретную исключительную ситуацию (on...), заданную своим именем, с группой операторов (do...), которые будут выполняться при ее возникновении. Что представляет собой имя ИС, будет рассмотрено позднее.
Пример блока try..finally:
try X := Y/Z; except on EZeroDivide do HandleZeroDivide; end;
При возникновении ИС директивы после on просматриваются последовательно, в порядке их описания. Каждый тип исключительной ситуации, описанной после ключевого слова on, обрабатывается именно этим блоком – выполняются операторы в нем, которые и будут реакцией на данную ситуацию.
Если возникла ситуация, не определенная ни в одной из директив, выполняются те операторы, которые стоят после else. Если и их нет, то ИС считается не обработанной и будет передана на следующий уровень обработки. Этим следующим уровнем обработки может быть другой оператор try...except, который содержит в себе данный блок. И так далее, пока ИС не будет обработана. На самом верхнем уровне вызывается обработчик ИС по умолчанию, предусмотренный в стандартном модуле SysUtils. Если и он не обработал ИС, то выполнение приложения будет аварийно завершено. После обработки ИС происходит выход из защищенного блока, и управление обратно в секцию try не передается.
Возможно, что блок except не содержит директив on...do. Например:
try X := Y/Z; except Z := 1; X := 0; end;
Тогда при возникновении любой ИС начнут выполняться операторы в секции except.
Если ИС происходит вне блока try...except, это не обязательно приводит к аварийному завершению всего приложения. Обработчики ИС по умолчанию Borland Delphi сделаны так, что в этом случае завершится лишь выполнение метода, внутри которого возникла ИС. Стандартная обработка подразумевает вывод на экран панели текстового сообщения с указанием типа ошибки.
Если в блоке обработки ИС указан оператор raise, то обработка будет передана во внешний блок обработки. В следующем примере в блоке обработки ИС уничтожается список строк, а далее обработка передается во внешний блок обработки ИС:
Sl := TStringList.Create; Try Sl.LoadfromFile(AFileName); Except Sl.Free; Raise; End;
Параллельно с блоком try...except в языке существует и блок try...finally. Он соответствует случаю, когда надо возвратить выделенные программе ресурсы как в рабочей, так и в аварийной ситуациях. Синтаксис блока try...finally следующий:
try <Операторы> finally <Операторы> end;
Следующие за try операторы исполняются в обычном порядке. Если за это время не возникло никаких ИС, далее выполняются те операторы, которые стоят после finally. В случае если между try и finally произошла ИС, управление немедленно передается на операторы после finally, которые называют кодом очистки. Там обычно располагают действия, которые освобождают ресурсы системы (память, файлы и т.д.). Если эти операторы поместить после finally, ресурсы будут освобождены в любом случае – и при корректном выполнении блока, и при возникновении ИС. Блок try...finally еще называют блоком защиты ресурсов.
Следует отметить, что блок try...finally не обрабатывает исключительные ситуации. Операторы после finally выполняются, если произошла любая ИС (или не произошла) а обработка ИС производится где-то вовне. Поэтому, достаточно часто блок try...finally вкладывают в блок try...except, который обработает ИС:
try try <Операторы> finally <Операторы> end; except on Exception1 do <Оператор> on Exception2 do <Оператор> ... else <оператор> end;
Допустимо и любое другое вкладывание блоков.