gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:33:48 25 4
gpt4 key购买 nike

是否可以在过程/函数内以字符串形式获取当前过程/函数的名称?我想会有一些“宏”在编译时扩展。

我的场景是这样的:我有很多给定记录的过程,它们都需要从检查记录的有效性开始,因此它们将记录传递给“验证器过程”。如果记录无效,验证器过程(所有过程都相同)会引发异常,并且我希望异常消息不包含验证器过程的名称,而是包含调用验证器的函数/过程的名称程序(自然)。

也就是说,我有

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
然后我们的所有例程都遵循相同的模板,并且我们在断言和其他异常引发中使用此常量。
由于 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 - 如何获取 Delphi 中当前过程/函数的名称(作为字符串),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2817699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com