class Backtrace
class Backtrace {}
A backtrace contains the dynamic call stack, usually leading up to a point where
an exception was thrown, and is a List of Backtrace::Frame objects. Its
default stringification excludes backtrace frames that are deemed unnecessary or
confusing; for example routines like &die
are hidden by default. Being a
list, you can also access individual elements.
sub zipi { { { die "Something bad happened" }() }() };
try {
zipi;
}
if ($!) {
say $!.backtrace[*-1].raku;
}
This will print the last frame in the list, pointing at the line where it's happened.
Methods
method new
multi method new()
multi method new(Int:D $offset)
multi method new(Mu \ex)
multi method new(Mu \ex, Int:D $offset)
multi method new(List:D $bt)
multi method new(List:D $bt, Int:D $offset)
Creates a new backtrace, using its calling location as the origin of the
backtrace or the $offset
that is passed as a parameter. If an object or a
list (that will already contain a backtrace in list form) is passed, they will
be used instead of the current code.
my $backtrace = Backtrace.new;
method gist
multi method gist(Backtrace:D:)
Returns string "Backtrace(42 frames)"
where the number indicates the number
of frames available via list method.
method Str
multi method Str(Backtrace:D:)
Returns a concise string representation of the backtrace, omitting
routines marked as is hidden-from-backtrace
, and at the discretion of
the implementation, also some routines from the setting.
my $backtrace = Backtrace.new;
say $backtrace.Str;
method next-interesting-index
method next-interesting-index(Backtrace:D: Int $idx = 0, :$named, :$noproto, :$setting)
Returns the index of the next interesting
frame, once hidden and other
settings are taken into account. $named
will decide whether to printed only
those with a name, $noproto
will hide proto
s, and $setting
will hide
those are considered setting.
sub zipi { { { die "Something bad happened" }() }() };
try zipi;
say $!.backtrace.next-interesting-index; # OUTPUT: «2»
say $!.backtrace.next-interesting-index( :named ); # OUTPUT: «4»
method outer-caller-idx
method outer-caller-idx(Backtrace:D: Int $startidx)
Returns as a list the index of the frames that called the current one.
sub zipi { { { die "Something bad happened" }() }() };
try zipi;
say $!.backtrace.outer-caller-idx( 4 ); # OUTPUT: «[6]»
method nice
method nice(Backtrace:D: :$oneline)
Returns the backtrace as a list of interesting frames. If :$oneline
is
set, will stop after the first frame.
sub zipi { { { die "Something bad happened" }() }() };
try zipi;
say $!.backtrace.nice( :oneline ) if $!;
# OUTPUT: « in sub zipi at /tmp/... line 1»
method full
multi method full(Backtrace:D:)
Returns a full string representation of the backtrace, including hidden frames, compiler-specific frames, and those from the setting.
my $backtrace = Backtrace.new;
say $backtrace.full;
method list
multi method list(Backtrace:D:)
Returns a list of Backtrace::Frame objects for this backtrace.
method summary
method summary(Backtrace:D: --> Str:D)
Returns a summary string representation of the backtrace, filtered
by !.is-hidden && (.is-routine || !.is-setting)
.
This program:
sub inner { say Backtrace.new.summary }
sub outer { inner; }
outer;
results in:
in method new at SETTING::src/core.c/Backtrace.rakumod line 85
in sub inner at test.raku line 1
in sub outer at test.raku line 2
in block <unit> at test.raku line 3
method concise
method concise(Backtrace:D:)
Returns a concise string representation of the backtrace, filtered
by !.is-hidden && .is-routine && !.is-setting
.
This program:
sub inner { say Backtrace.new.concise }
sub outer { inner; }
outer;
results in:
in sub inner at test.raku line 1
in sub outer at test.raku line 2
method map
multi method map(Backtrace:D: &block --> Seq:D)
It invokes &block
for each element and gathers the return values in a sequence and returns it.
This program:
sub inner { Backtrace.new.map({ say "{$_.file}: {$_.line}" }); }
sub outer { inner; }
outer;
results in:
SETTING::src/core.c/Backtrace.rakumod: 85
SETTING::src/core.c/Backtrace.rakumod: 85
test.raku: 1
test.raku: 2
test.raku: 3
test.raku: 1
method flat
multi method flat(Backtrace:D:)
Returns the backtrace same as list.