Главная » Delphi » Перехват исключений в 16  разрядной Delphi

0

В среде  16 разрядной Delphi 1 объекты исключений имели  формат, специфический именно для этой среды разработки. Поэтому  при передаче исключений библиотекой DLL их приходилось перехватывать до выхода  из подпрограмм DLL, поскольку, освобождая при проходе стек вызова модулей, они приводили к возникновению ошибки и аварийному завершению приложения. Во избежание таких  неприятностей каждую точку входа в биб лиотеку DLL следовало заключать в собственный блок обработки исключения, как показа но в следующем примере:

procedure SomeDLLProc;

begin

try

{ Здесь находится содержимое }

except

on Exception do

{ Не позволять исключению покинуть этот блок, обязательно

обработать его здесь и не передавать повторно. }

end;

end;

В Delphi  2 такого  уже не было.  Исключения Delphi  6 полностью соответствуют ис ключениям Win32. Исключения библиотек DLL больше не зависят ни от языка Delphi, ни от компилятора, а являются, скорее, компонентом операционной системы Win32.

Впрочем, для этого  необходимо удостовериться, что  модуль SysUtils включен в раздел  uses исходного файла  библиотеки DLL. В противном случае Delphi  отключит поддержку  исключений внутри библиотек DLL.

CОВЕТ

Большинство приложений Win32 неспособно самостоятельно обрабатывать исключе- ния, поэтому ни то, что исключения Delphi совместимы с исключениями Win32, ни то, что исключение можно передать из библиотеки DLL в главную программу, не спасет, вероятно, положение от аварийного завершения.

Если главное приложение создано в Delphi или C++Builder, то проблем не должно быть, но если это недоработанный код C и C++, то исключение сможет доставить мно- го неприятностей.

Следовательно, чтобы сделать библиотеку DLL полностью отказоустойчивой, необхо- димо использовать старый, как у 16-разрядной Windows, метод защиты DLL по точкам входа с помощью блока try..except. Это позволит гарантированно перехватывать и

обрабатывать исключения внутри самой DLL и не полагаться на возможности ее поль-

зователей.

НА ЗАМЕТКУ

Когда приложение, написанное на языке, отличном от Delphi, использует библиотеку DLL, созданную в Delphi, оно не сможет работать с классами исключений Delphi. Но и такая ситуация может быть обработана как системное исключение Win32, представ- ленное кодом $0EEDFACE. При этом адресом исключения будет первый элемент мас- сива ExceptionInformation структуры EXCEPTION_RECORD системы Win32. Второй элемент такого массива содержит ссылку на объект исключения Delphi. Более подроб- ная информация по данной теме приведена в интерактивной справочной системе Delphi.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии