class Backtrace
ErrorsCollection

class Backtrace

Snapshot of the dynamic call stack

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 \exInt:D $offset)
multi method new(List:D $bt)
multi method new(List:D $btInt: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 protos, 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-idx4 ); # 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.pm6 line 85
in sub inner at test.p6 line 1
in sub outer at test.p6 line 2
in block <unit> at test.p6 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.p6 line 1
in sub outer at test.p6 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.pm6: 85
SETTING::src/core.c/Backtrace.pm6: 85
test.p6: 1
test.p6: 2
test.p6: 3
test.p6: 1

method flat

multi method flat(Backtrace:D:)

Returns the backtrace same as list.