如何判断Delphi的THeapException是否与堆相关,而不是Windows GDI或其他什么?

问题描述 投票:0回答:1

在Delphi的VCL类库中,EOutOfResources异常类被定义为EOutOfMemory的子类,它是EHeapException的子类,它是基本异常类Exception的子类。 http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Classes.EOutOfResources

EOutOfResources的描述说:“当应用程序尝试创建Windows或窗口小部件句柄并且没有更多句柄可供分配时,会引发EOutOfResources。”

EOutOfMemory的描述说:“EOutOfMemory在应用程序尝试分配动态内存时发生,但系统中没有足够的可用内存来满足请求。”

对我来说,堆内存是“资源”的一个特例,而Windows GDI句柄与堆内存的关系很少或根本没有。这基本上是一个错误和建模错误?或者有没有办法可靠地知道异常是否与堆实际相关?是否有针对每种异常类型的特殊案例处理代码,而忽略了类层次结构?

在异常处理程序中处理Exception对象时,即使它在语法语义上“is-a EHeapException”,它可能根本不是与堆相关的异常,并且要采取的纠正措施应该完全不同。它的外观,即使是处理VCL产生的错误,我也不能使用“is”语句,更不用说第三方组件在建模异常错误情况时似乎更放松了。

delphi exception-handling
1个回答
3
投票

层次结构如下:

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
© www.soinside.com 2019 - 2024. All rights reserved.