Решение проблемы утечки ресурсов в блоке try ..finally — КиберПедия 

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Решение проблемы утечки ресурсов в блоке try ..finally

2018-01-04 176
Решение проблемы утечки ресурсов в блоке try ..finally 0.00 из 5.00 0 оценок
Заказать работу

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

Рассмотрим пример утечки ресурсов в случае возникновения исключения: AssignFile (F, 'a.fcmp'); Rawrite (F); Hew (P);

...// Код., генерирующий исключение Erase (F); Dispose (P);

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

 


 

память не очистится. Для того чтобы избежать утечки ресурсов, можно

использовать специальную конструкцию обработки исключения: try...finally. Try

«операторы, способные привести к исключению» finally

«операторы, выполняемые в любом случае» end;

В этом случае операторы в разделе finally будут выполняться всегда, независимо от того было исключение или нет. После выполнения этих операторов вычисление прерывается. Например: AssignFile (F, 'a.tmp'); Rewrite (F); New (P); try

Код, генерирующий исключение finally

Erase (F); Dispose (P); ' end;

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

except, и finally могут использоваться совместно. Например: try try

Код, генерирующий исключение. finally

End; j

Except

end;

Защита кода зачистки на уровне модуля в разделе finalization

Рассмотренный выше блок try...finally позволяет защитить ресурсы внутри блока. Для глобальных ресурсов модуля существует другой способ выделения и инициализации ресурсов, защищенный от утечки ресурсов. Он реализуется с помощью двух специальных включаемых в модуль разделов initialization и finalization. Раздел initialization, выполняемый один раз при первом упоминании в программе данного модуля, можно использовать для однократного выделения необходимых глобальных ресурсов. А раздел finalization, гарантированно выполняемый в конце работы программы независимо от наличия или отсутствия исключений, можно использовать для зачистки ранее выделенных ресурсов.

Например, необходимо после завершения работы программы удалить все файлы *.tmp из каталога dirtmp:

unit....;Н

var ь

SR: TSearchRec; F: File;

Result: integer; initialization

Finalization

result:= FindFirst (dirtmp + '«.trap', faAnyFile, SR); while result = 0 do begin

AssignFile (F, dirtmp+SR.name); Erase <F); result FindNext end;

FindClose (SR); end.

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

Простейший путь генерации исключения EAbort - вызов функции Abort.

Например:

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

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

соответствующий оператор on: on EAbort do...;

Базовый класс исключений Exception Все предопределенные в Delphi классы исключений являются прямыми или косвенными наследниками класса Exception, объявленного в модуле SysUtils и наследующего непосредственно TOb ject. Exception = class(TObject) private


Поделиться с друзьями:

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.012 с.