- •Раздел 2. Механизмы последовательного выполнения программ
- •2.1. Классификация методов замены контекста
- •2.2. Процедуры как синхронные методы замены контекста
- •2.3. Сопрограммы
- •2.4. Примеры реализации сопрограмм в Си, в защищенном режиме процессора и в Win32
- •2.4.1. Пример реализации сопрограмм в Си
- •2.4.2. Пример реализации сопрограмм в защищенном режиме
- •2.4.3. Пример реализации сопрограмм в Win32
- •2.5. Процедуры ос
- •2.6. Прерывания как асинхронный метод замены контекста
- •2.7. Исключения
- •2.7.1. Самая общая характеристика исключений
- •2.7.2 Исключения на низком уровне
- •2.7.3. Исключения в программных средах
- •2.7.4. Обработка исключений в Delphi
- •2.7.4.1. Защита ресурсов
- •2.7.4.2. Обработка исключений
2.7.4. Обработка исключений в Delphi
Delphi является достаточно широко используемой системой программирования, поэтому рассмотрим обработку исключений в Delphi более подробно. Исключение в Delphi носит двоякий характер. С одной стороны - это традиционное понятие - сигнал об ошибочном отклонении в выполнении операторов, а с другой стороны - это объект, содержащий информацию о характере и месте ошибки. То есть здесь на понятие исключения накладывается объектно-ориентированная концепция. При возникновении исключения создается экземпляр объекта-исключения с помощью метода-конструктора, а после обработки экземпляр объекта-исключения разрушается методом-деструктором. Причем разрушение всегда производится автоматически самой средой.
На самом верхнем уровне вводится понятие надежного приложения. Надежное приложение не вылетает в среду при каждой ошибке, а пытается исправить ее внутри себя. Чтобы приложение было надежным, необходимо, чтобы оно было способно распознавать исключительные ситуации и реагировать на них. Следующим понятием является защищенный блок кода. Это блок, на котором определен отклик на исключения. Если в блоке отклик на исключение не определен, а исключение возникло, то оно передается на обработку во внешний блок и т. д. Если ни в одном из блоков исключение не определено, то оно передается на обработку среде, а приложение аварийно завершает выполнение. Защищенный блок кода описывается зарезервированными словами try ... end. Внутри этого блока помещаются операторы, на которых желательно обработать исключения, и сами операторы обработки исключений.
2.7.4.1. Защита ресурсов
Поскольку при возбуждении исключения нарушается естественный порядок следования операторов, то наиболее типичной ситуацией в этом случае является не освобождение ранее захваченных ресурсов. К таким ресурсам в первую очередь относятся файлы и память. Delphi предоставляет возможность возврата ранее захваченных ресурсов при возбуждении исключения без выяснения причин самого исключения. Для этого используется первый вариант из двух вариантов защищенного блока.
Вопрос (
Структура блока кода с защищенным от исключения выделением ресурса приведена ниже:
Выделение ресурса; {1}
try
Операторы, использующие ресурс, на которых может возникнуть исключение; {2}
finally
Освобождение ресурса; {3}
end;
)Вопрос
Защищенный блок работает следующим образом:
если исключения нет, то последовательность выполнения операторов следующая - 1, 2, 3;
если на участке try ... finally возникает исключение, то управление немедленно передается за finally, где выполняется оператор 3. Операторы за finally называются кодом очистки.
Приведенный вариант защищенного блока try...finally...end является вариантом именно защиты от исключительной ситуации, а не обработкой ее. Код очистки не имеет даже информации о том, каким способом программа подошла к его выполнению – естественным порядком или через исключение.
Данный пример можно сравнить с последним примером из Ады, решающим ту же самую задачу.
Для выполнения именно обработки исключения необходимо знать причину исключения. Библиотека Delphi содержит большой набор предопределенных исключений, краткая характеристика которых представлена ниже.
