如何判断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或其他什么?的主要内容,如果未能解决你的问题,请参考以下文章