Можно ли получить имя текущей процедуры / функции в виде строки внутри процедуры / функции? Я предполагаю, что будет некоторый «макрос», который раскрывается во время компиляции.
Мой сценарий таков: у меня есть много процедур, которым дается запись, и все они должны начинаться с проверки достоверности записи, и поэтому они передают запись в «процедуру проверки». Процедура валидатора (одна и та же для всех процедур) вызывает исключение, если запись недействительна, и я хочу, чтобы сообщение об исключении включало не имя процедуры валидатора, а имя функции / процедуры, вызвавшей валидатор процедура (естественно).
То есть у меня
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;