Как определить, связано ли с Delphi THeapException, а не Windows GDI или что-то еще? - PullRequest
0 голосов
/ 06 сентября 2018

В библиотеке классов VCL Delphi класс исключений EOutOfResources определен как подкласс EOutOfMemory, который является подклассом EHeapException, который является подклассом базового класса исключений Exception. http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Classes.EOutOfResources

Описание EOutOfResources гласит: «EOutOfResources вызывается, когда приложение пытается создать дескриптор Windows или виджета, и больше нет дескрипторов для выделения».

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

Для меня кучи памяти - это особый случай «ресурса», а дескрипторы Windows GDI имеют очень мало или вообще не имеют ничего общего с кучей памяти. Это в основном ошибка и ошибка моделирования? Или есть какой-нибудь способ достоверно узнать, было ли исключение на самом деле кучи? У вас есть специальный код для обработки всех типов исключений и игнорируется иерархия классов?

При обработке объекта Exception в обработчике исключений, даже если он «is-a EHeapException» в синтаксическом смысле языка, он может вообще не быть исключением, связанным с кучей, и корректирующие действия, которые необходимо выполнить, должны быть совершенно другими. Как это выглядит, я не могу использовать оператор «is» даже для работы с ошибками, вызванными VCL, не говоря уже о сторонних компонентах, которые кажутся более расслабленными, когда дело доходит до моделирования ситуаций ошибок с исключениями.

1 Ответ

0 голосов
/ 06 сентября 2018

Иерархия такая:

EHeapException
|
|-- EInvalidPointer
|
|-- EOutOfMemory
    |
    |-- EOutOfResources

Таким образом, вы можете проверить, как это:

if E is EOutOfResources then
  // probably GDI resource leak
else if E is EOutOfMemory then
  // probably memory or address space is exhausted 
else if E is EInvalidPointer then
  // probably heap corruption
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...