Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АИСд шпора2.docx
Скачиваний:
8
Добавлен:
27.09.2019
Размер:
86.39 Кб
Скачать

46. Исключительные ситуации.

Когда возникает исключительная ситуация, то, независимо от ее источника, программа узнает о ней.

Компилятор создает код, который в состоянии прервать выполнение программы. После прерывания из стека,

содержащего локальные переменные, начинают

“выталкиваться” данные. Процесс “выталкивания”

данных продолжается до тех пор, пока не произойдет одно из двух событий:

1. Выполнение программы дойдет до операторов

локальной обработки исключительной ситуации.

2. Управление будет передано встроенному

глобальному обработчику исключительной ситуации.

Приложение в большинстве случаев

должно содержать программные фрагменты,

предназначенные для обработки

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

ситуации создается объект обработки ошибки, остающийся в памяти до тех пор, пока он не будет оттуда удален.

В любом приложении, основанном на VCL, имеется глобальная переменная Application, являющаяся экземпляром

класса TApplicaton. Этот класс определен в модуле в модуле

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

глобального механизма обработки исключительных ситуаций.

Как только произойдет исключительная ситуация, объект

Application генерирует событие OnException. Событию

Tapplication.OnException можно назначить собственный

обработчик. Этот процесс называется делегированием событий.

Если никакая процедура не назначена, то событие OnException

вызывает стандартный обработчик.

Наряду с механизмом делегирования

программную обработку ошибок можно

осуществить с помощью специальных операторов. Для этих целей определены

две конструкции:

• Try…finally

• Try…except

Они совершенно аналогичны по

синтаксису, но различаются по назначению.

47.Try..finally

Конструкция try…finaly имеет

следующий синтаксис:

Try

<операторы>

finally

<операторы>

end;

Если в любом из операторов,

размещенных между try…finally, возникает

исключительная ситуация, их выполнение

прекращается и управление передается

первому оператору, следующему за

ключевым словом finally. После этого

выполняются все операторы, стоящие

между finally и end( операторы, стоящие

между finally и end выполняются и в том

случае, если ошибки не произошло).

Конструкция try…finally применяется для

довольно длительного перехвата

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

программы действия, прежде чем управление

будет передано глобальному обработчику

исключительных ситуаций или следующему

уровню обработки ошибки. Эта конструкция

не удаляет экземпляра объекта обработки

исключительной ситуации, а только сообщает

о ней.

48.Try..except.

Конструкция try…except применяется

для перехвата исключительной ситуации c

последующей возможной обработкой,

предусматривающей освобождение

экземпляра объекта обработки

исключительной ситуации, после чего

выполнение программы продолжается, что

и отличает, главным образом, оператор

try…except от try..finally.

В этой конструкции есть необязательный

дополнительный элемент, с помощью которого можно

определить фактический тип возникшей

исключительной ситуации, - элемент вида on…do:

try

<операторы>

except

on E: Exception do <оператор>

on E: Exception do <оператор>

else <оператор>

end;

После ключевого слова else часто следует ключевое

слово Raise, которое переводит обработку ошибки на новый уровень (разрешается создавать вложенные

блоки try), например, на уровень глобального

обработчика. Raise прерывает программу и выталкивает

данные из стека. Однако, если будет записано Raise

<процедура>, где процедура позволяет создать собственно исключение, то выталкивания данных из

стека не последует (если только внутри процедуры не

возникнет ошибки). Процедура, записанная после Raise, должна быть особого вида – она должна быть

конструктором, так как она должна создать объект какого-либо класса исключений.

В заключение отметим, что блок от Try

до finally (или до except) называется блоком

ресурсов, а последний блок до end –

блоком очистки.