微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何获取Delphi中的当前过程/函数的名称(作为字符串)

在程序/函数内可以获取当前过程/函数名称作为字符串吗?我想在编译时会扩展一些“宏”。

我的方案是这样的:我有很多程序被给予记录,并且他们都需要从检查记录的有效性开始,所以他们将记录传递到“验证程序”。验证器过程(对于所有过程相同)会引发异常,如果记录无效,并且我希望异常的消息不包括验证器过程的名称,而是调用验证器的函数/过程的名称程序(自然)。

就是我有

procedure ValidateStruct(const Struct: TMyStruct; const Sender: string);
begin
 if <StructIsInvalid> then
    raise Exception.Create(Sender + ': Structure is invalid.');
end;

接着

procedure SomeProc1(const Struct: TMyStruct);
begin
  ValidateStruct(Struct,'SomeProc1');
  ...
end;

...

procedure SomeProcN(const Struct: TMyStruct);
begin
  ValidateStruct(Struct,'SomeProcN');
  ...
end;

如果我可以写一些类似的东西,这样会更容易出错

procedure SomeProc1(const Struct: TMyStruct);
begin
  ValidateStruct(Struct,{$PROCNAME});
  ...
end;

...

procedure SomeProcN(const Struct: TMyStruct);
begin
  ValidateStruct(Struct,{$PROCNAME});
  ...
end;

然后每次编译器遇到一个{$ PROCNAME}时,它只需将“宏”替换为当前函数/过程的名称作为字符串文字

更新

第一种方法的问题是容易出错。例如,由于复制粘贴,容易发生错误

procedure SomeProc3(const Struct: TMyStruct);
  begin
    ValidateStruct(Struct,'SomeProc1');
    ...
  end;

或打字错误

procedure SomeProc3(const Struct: TMyStruct);
begin
  ValidateStruct(Struct,'SoemProc3');
  ...
end;

或只是暂时的混乱:

procedure SomeProc3(const Struct: TMyStruct);
begin
  ValidateStruct(Struct,'SameProc3');
  ...
end;

解决方法

我们正在做类似的事情,只依赖于一个约定:在一开始就放置一个保持函数名的const SMethodName。
然后我们所有的例程都遵循相同的模板,我们在Assert和其他异常提升中使用这个const。
由于const与常规名称的接近,很少有机会错字或任何差异会留在那里很久。
YMMV当然…
procedure SomeProc1(const Struct: TMyStruct);
const
  SMethodName = 'SomeProc1';
begin
  ValidateStruct(Struct,SMethodName);
  ...
end;

...

procedure SomeProcN(const Struct: TMyStruct);
const
  SMethodName = 'SomeProcN';
begin
  ValidateStruct(Struct,SMethodName);
  ...
end;

原文地址:https://www.jb51.cc/delphi/103370.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐