不要直接引发 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
异常对象是否有特殊之处?如果这个 是一个坏主意,那么在这里简单地提出一个自定义异常是明智的吗?
答案 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)
...
的特殊之处在于InvalidPointer
和EInvalidPointer
&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">