The Code
codeunit 50104 "Get Callstack"
{
SingleInstance = true;
[ErrorBehavior(ErrorBehavior::Collect)]
procedure GetCallstack() Callstack: Text
var
LF: Char;
begin
LF := 10;
Error(ErrorInfo.Create('', true));
Callstack := GetCollectedErrors(true).Get(1).Callstack;
exit(Callstack.Substring(Callstack.IndexOf(Format(LF)) + 1));
end;
}
Yea, but…why?
I dunno, I was just curious whether it was possible. And, it is 🧐 Any sensible applications are probably going to be do with error handling or reporting.
You may be tempted to have your code respond differently depending on the context in which it has been called and read the callstack for that purpose. That’s not a train you want to ride though. I’ve tried, it stops at some pretty weird stations.
One advantage of this approach over using a TryFunction (as below) is that the debugger doesn’t break on collectible errors. It can sometimes be frustrating stepping through errors that are always caught to get to the code that you actually want to debug.
procedure LessGoodGetCallstack(): Text
begin
ThrowError();
exit(GetLastErrorCallstack());
end;
[TryFunction]
procedure ThrowError()
begin
Error('');
end;
It’s a good tip, but when you are trying to potentially error handle someone else’s code, and they didn’t implement collectible errors, you’re stuck and back to the try function it is.
LikeLike