Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка ООП.doc
Скачиваний:
23
Добавлен:
08.11.2018
Размер:
1.4 Mб
Скачать
  1. Обработка исключительных ситуаций

Иногда некоторые операторы в программе приводят к ошибке: деление на ноль, открытие несуществующего файла и т.д. Хотелось бы, чтобы программа при возникновении таких ошибок продолжала функционировать и как-то реагировала на ошибки. Например, сообщала пользователю, что не может записать информацию в файл, т.к. нет места на диске. Этого можно попытаться добиться, сделав каждый оператор условным, но есть более простой путь – структурированная обработка исключительных ситуаций.

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

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

Операторы 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;

Допустимо и любое другое вкладывание блоков.