在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