Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_Delphi_1курс лекции / Тема 19 Исключения.doc
Скачиваний:
46
Добавлен:
23.03.2015
Размер:
99.84 Кб
Скачать

Исключение eAbort и функция Abort

В Delphi имеется исключение EAbort, несколько отличающееся от остальных. Генерация этого исключения, как и любых других, прерывает процесс вычисления. Но если приложение не отлавливает операторомon исключений этого класса, то они попадают в обработчикTApplication.HandleException и там, в отличие от других исключений, разрушаются без всяких сообщений. Таким образом, это “молчаливое” прерывание процесса вычисления, при котором не должно отображаться диалоговое окно с сообщением об ошибке. Простейший путь генерации исключенияEAbort — вызов процедурыAbort. Например:

if <проверка условия прерывания> then Abort;

Обычное применение EAbort — прерывание вычислений при выполнении некоторого условия окончания или условия прерывания пользователем (например, при нажатии клавиши Esc или какого-то оговоренного сочетания клавиш). Таким образом, генерация “молчаливого”исключения процедуройAbort эквивалентна применениюExit илиBreak (если вся текущая процедура является циклом). ОтличиеAbort от Exit и Break заключается в том, чтоBreak прерывает только цикл и управление передается следующему после него оператору,Exit прерывает только текущую процедуру и управление передается в вызвавшую ее процедуру(если только текущая процедура неmain), a Abort прерывает текущую процедуру и все вызвавшие ее процедуры, передавая управление на самый верх. Таким образом это наиболее простой возврат из глубоко вложенных процедур. Впрочем, можно при необходимости перехватить исключение на каком-то промежуточном уровне, предусмотрев на нем блокtry...except и вставив в его разделexcept соответствующий оператороn:

on EAbort do

Блок try...Finally

Параллельно с блоком try..except в языке существует и try. .finally. Он соответствует случаю, когда необходимо возвратить выделенные программе ресурсы даже в случае аварийной ситуации. Синтаксис блока try..finally таков:

try

<Оператор> 

<Оператор>

...

finally 

<Оператор>

...

end;

Смысл этой конструкции можно описать одним предложением: операторы, стоящие после finally, выполняются всегда.

Следующие за try операторы исполняются в обычном порядке. Если за это время не возникло никаких ИС, далее следуют те операторы, которые стоят после finally. В случае, если между try и finally произошла ИС, управление немедленно передается на операторы после finally, которые называются кодом очистки. Допустим, вы поместили после try операторы, которые должны выделить вам ресурсы системы (дескрипторы блоков памяти, файлов, контекстов устройств и т. п.). Тогда операторы, освобождающие их, следует поместить после finally, и ресурсы будут освобождены в любом случае. Блок try...finally, как можно догадаться, еще называется блоком защиты ресурсов.

Важно обратить внимание на такой факт: данная конструкция ничего не делает с самим объектом — исключительной ситуацией. Задача try...finally — только прореагировать на факт нештатного поведения программы и проделать определенные действия. Сама же ИС продолжает "путешествие" и вопрос ее обработки остается на повестке дня.

Блоки защиты ресурсов и обработчики ИС, как и другие блоки, могут быть вложенными.

В блок try...finally не включаются обработки исключений. При выполнении операторов раздела finally неизвестно, было или не было сгенерировано исключение (такие средства проверки, как функция ExceptAddr, этого не показывают). Для обработки исключений используются блоки try...except, которые никак не связаны с блоками try...finally. Впрочем, эти виды блоков могут использоваться совместно. Например:

try {начало блока try...except}

................

try {начало блока try...finally}

................

finally

................

end; {конец блока try...finally}

except

................

end; {конец блока try...except}