如何获取Delphi中的当前过程/函数的名称(作为字符串)
发布时间:2020-12-15 10:15:41 所属栏目:大数据 来源:网络整理
导读:在程序/函数内可以获取当前过程/函数的名称作为字符串吗?我想在编译时会扩展一些“宏”。 我的方案是这样的:我有很多程序被给予记录,并且他们都需要从检查记录的有效性开始,所以他们将记录传递到“验证程序”。验证器过程(对于所有过程相同)会引发异常,
在程序/函数内可以获取当前过程/函数的名称作为字符串吗?我想在编译时会扩展一些“宏”。
我的方案是这样的:我有很多程序被给予记录,并且他们都需要从检查记录的有效性开始,所以他们将记录传递到“验证程序”。验证器过程(对于所有过程相同)会引发异常,如果记录无效,并且我希望异常的消息不包括验证器过程的名称,而是调用验证器的函数/过程的名称程序(自然)。 就是我有 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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |