为什么不提出EInvalidPointer?

时间:2016-12-20 18:26:29

标签: delphi invalid-pointer

德尔福documentation states

  

不要直接引发 EInvalidPointer 异常。 EInvalidPointer 由内存管理器在内部引发。

我正在编写一个自定义基类作为TInterfacedObject的替代,尽可能地遵循RTL实现,并且通过示例看,RTL实现TInterfacedObject BeforeDestruction as:

procedure TInterfacedObject.BeforeDestruction;
begin
  if RefCount <> 0 then
    Error(reInvalidPtr);  
end;

Error(reInvalidPtr)通过RTL本地的各种单位范围方法引发EInvalidPointer

如果我正在编写自己的课程,我该如何实施BeforeDestruction?为什么不这样做? :

procedure TMyInterfacedObject.BeforeDestruction;
begin
  if RefCount <> 0 then
    raise EInvalidPointer.CreateRes(@SInvalidPointer) at ReturnAddress;
end;

InvalidPointer中声明的全局SysUtils异常对象是否有特殊之处?如果这个 是一个坏主意,那么在这里简单地提出一个自定义异常是明智的吗?

2 个答案:

答案 0 :(得分:10)

David's answer的补充; my_resource_parser = api.parser() my_resource_parser.add_argument('name', type=str, default='string: name', required=True) my_resource_parser.add_argument('state', type=str, default='string: state') @api.route('/my-resource/<id>') class MyResource(Resource): def post(self): args = my_resource_parser.parse_args(strict=True) ... 的特殊之处在于InvalidPointerEInvalidPointer&lt; - &gt; OutOfMemory的上升EHeapException的文档主题中更详细地解释了EOutOfMemory

  

EHeapException 是与堆分配内存相关的错误的异常类。

     

使用EHeapException 的后代-EOutOfMemory和EInvalidPointer-   处理动态内存和无效指针的失败分配   操作

     

注意:只要应用程序启动,就会在应用程序启动时预先分配这些异常的内存并保持分配状态   运行。永远不要直接提出 EHeapException 或其后代。

我猜测的是,一旦你遇到内存问题,分配内存来创建这些错误可能不安全:因为缺乏内存或可能存在腐败......

答案 1 :(得分:6)

避开原始问题,您可以避免仅使用与运行时相同的代码来询问它:

//Selenium(C#): 
// evaluates to "null"
string someStringName = someIWebElement.GetAttribute("parentId");
   

//HTML tag (example): 
// in Chrome the parentId is visible and unique
<g id="333-aaa" parentId="qqq-bbb">