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

前端之家收集整理的这篇文章主要介绍了如何获取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;

猜你在找的Delphi相关文章