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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判断Delphi的THeapException是否与堆相关,而不是Windows GDI或其他什么?相关的知识,希望对你有一定的参考价值。

在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”语句,更不用说第三方组件在建模异常错误情况时似乎更放松了。

答案

层次结构如下:

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

以上是关于如何判断Delphi的THeapException是否与堆相关,而不是Windows GDI或其他什么?的主要内容,如果未能解决你的问题,请参考以下文章

delphi中如何判断是否数字?

delphi如何能判断网络通不通?

如何判断delphi文本框输入的是数字

Delphi中如何判断当前光标的位置

delphi提取文件中的ICO图标的问题,保存到本地全部都是32* 32的,如何判断图标尺寸?

delphi,excel:如何判断某个变量是属于啥对象类型?