Студопедия — Блок try...finally
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Блок try...finally






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

Try

<Оператор>

<Оператор>

...

Finally

<Оператор>

...

end;

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

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

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

Блоки защиты ресурсов и обработчики ИС, как и другие блоки, могут быть вложенными. В этом простейшем примере каждый вид ресурсов системы защищается в отдельном блоке:

Try

AllocatelstResource;

Try

Allocate2ndResource;

SolveProblem;

Finally

Free2ndResource;

end;

Finally

FreelstResource;

end;

Можно также вкладывать обработчики друг в друга, предусмотрев в каждом специфическую реакцию на ту или иную ошибку:

var i,j,k: Integer;

Begin

i:= Round(Random);

j:= 1 - i;

Try

k:= 1 div i;

Try

k:= 1 div j;

Except

On EDivByZero do

ShowMessage('Вариант 1: j=0');

end;

Except

On EDivByZero do

ShowMessage('Вариант 2: i=0');

end;

end;

Но все же идеально правильный случай — это сочетание блоков двух типов. В один из них помещается общее (освобождение ресурсов в finally), в другой - особенное (конкретная реакция внутри except).

Использование исключительных ситуаций

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

  1. Если ситуация возникла внутри блока try..except, то там она и будет обработана. Если ИС "продвинута" дальше при помощи оператора raise, а также если она возникла в блоке try..finally, обработка продолжается.
  2. Если программистом определен обработчик события Application.onException, то он получит управление. Обработчик объявлен следующим образом:

TExceptionEvent = procedure (Sender: TObject; E: Exception) of object;

  1. Если программист никак не определил реакцию на ИС, то будет вызван стандартный метод ShowException, который сообщит о классе и месте возникновения исключительной ситуации.

Протоколирование исключительных ситуаций

Часто нужно иметь подробный материал для анализа причин возникновения ИС. Разумно было бы записывать все данные о них в файл, чтобы потом прогнозировать ситуацию. Такой подход важен для программ, которые так или иначе будут отчуждены от разработчика: в случае возникновения непредвиденной ситуации это позволит ответить на вопросы "кто виноват?" и "что делать?". В следующем примере предложен вариант реализации протоколирования ИС.

const LogName: string = 'c:\appexc.log';

procedure LogException;

var fs: TFileStream; m: word;buf: array[0..511] of char;

Begin

If FileExists(LogName) then

m:= fmOpenReadWrite

Else

m:= fmCreate;

fs:= TFileStream.Create(LogName,m);

fs.Seek(0,soFromEnd);

StrPCopy(Buf,DateTimeToStr(Mow)+'. ');

ExceptionErrorMessage(ExceptObject,ExceptAddr,@buf[StrLenfbuf)],SizeOf(Buf)-StrLen(buf));

StrCat(Buf,#13#10);

fs.WriteBuffer (Buf, StrLer.;buf));

fs.Free;

end;

Здесь задачу записи информации об ИС решает процедура LogException. Она открывает файловый поток и пишет туда информацию, отформатированную При помощи уже упоминавшейся функции ExceptionErrorMessage.

В качестве ее параметров выступают значения функций Exceptobject и ExceptAddr. К сформированной строке добавляется время возникновения ИС. Для каждого защищаемого блока кода создаются две вложенные конструкции try…except. Первая, внутренняя — для вас; в ней ИС протоколируется и продвигается дальше. Внешняя — для пользователя; именно в ней проводится анализ типа ИС и готовится сообщение.

В Object Pascal существует и расширенный вариант употребления оператора

raise:

raise окземпляр объекта типа Exception> [at <адрес>]

Естественно, объектный тип должен быть порожден от Exception. To, что в таком типе ничего не переопределено, не столь важно - главное, что в обработчике ИС можно отследить именно этот тип.

ELoginError = class (Exception);

If LoginAttemptsNo > MaxAttempts

then raise ELoginError.Create('Ошибка регистрации пользователя');

Конструкция at <адрес> используется для того, чтобы изменить адрес, к которому привязывается возникшая ИС, в пределах одного блока обработки ИС.

 







Дата добавления: 2015-10-01; просмотров: 309. Нарушение авторских прав; Мы поможем в написании вашей работы!



Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

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

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Выработка навыка зеркального письма (динамический стереотип) Цель работы: Проследить особенности образования любого навыка (динамического стереотипа) на примере выработки навыка зеркального письма...

Словарная работа в детском саду Словарная работа в детском саду — это планомерное расширение активного словаря детей за счет незнакомых или трудных слов, которое идет одновременно с ознакомлением с окружающей действительностью, воспитанием правильного отношения к окружающему...

Правила наложения мягкой бинтовой повязки 1. Во время наложения повязки больному (раненому) следует придать удобное положение: он должен удобно сидеть или лежать...

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

Мотивационная сфера личности, ее структура. Потребности и мотивы. Потребности и мотивы, их роль в организации деятельности...

Классификация ИС по признаку структурированности задач Так как основное назначение ИС – автоматизировать информационные процессы для решения определенных задач, то одна из основных классификаций – это классификация ИС по степени структурированности задач...

Studopedia.info - Студопедия - 2014-2024 год . (0.01 сек.) русская версия | украинская версия