class Backtrace {}

回溯包含动态调用堆栈,通常导致异常抛出的点,并且是 Backtrace::Frame 对象的列表。其默认字符串化排除了被认为不必要或令人困惑的回溯帧;例如,默认情况下隐藏 &die 等例程。作为一个列表,您还可以访问各个元素。

sub zipi { { { die "Something bad happened" }() }() };
try {
    zipi;
}
if ($!{
    say $!.backtrace[*-1].raku;
}

这将打印列表中的最后一个帧,指向发生它的行。

方法§

方法 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)

创建一个新的回溯,使用其调用位置作为回溯的起点或作为参数传递的 $offset。如果传递了一个对象或一个列表(其中已经包含列表形式的回溯),它们将被用于当前代码。

my $backtrace = Backtrace.new;

方法 gist§

multi method gist(Backtrace:D:)

返回字符串 "Backtrace(42 frames)",其中数字表示通过 list 方法可用的帧数。

方法 Str§

multi method Str(Backtrace:D:)

返回回溯的简洁字符串表示形式,省略标记为 is hidden-from-backtrace 的例程,并且根据实现的自由裁量权,还省略设置中的一些例程。

my $backtrace = Backtrace.new;
say $backtrace.Str;

方法 next-interesting-index§

method next-interesting-index(Backtrace:D: Int $idx = 0:$named:$noproto:$setting)

返回下一个 interesting 帧的索引,一旦考虑了隐藏和其他设置。$named 将决定是否仅打印那些有名称的帧,$noproto 将隐藏 proto,并且 $setting 将隐藏那些被认为是设置的帧。

sub zipi { { { die "Something bad happened" }() }() };
try zipi;
say $!.backtrace.next-interesting-index;           # OUTPUT: «2␤» 
say $!.backtrace.next-interesting-index:named ); #  OUTPUT: «4␤» 

方法 outer-caller-idx§

method outer-caller-idx(Backtrace:D: Int $startidx)

以列表形式返回调用当前帧的帧的索引。

sub zipi { { { die "Something bad happened" }() }() };
try zipi;
say $!.backtrace.outer-caller-idx4 ); # OUTPUT: «[6]␤» 

方法 nice§

method nice(Backtrace:D: :$oneline)

将回溯作为interesting 帧的列表返回。如果设置了 :$oneline,将在第一个帧后停止。

sub zipi { { { die "Something bad happened" }() }() };
try zipi;
say $!.backtrace.nice:oneline ) if $!;
# OUTPUT: «  in sub zipi at /tmp/... line 1␤␤» 

方法 full§

multi method full(Backtrace:D:)

返回回溯的完整字符串表示形式,包括隐藏帧、特定于编译器的帧以及设置中的帧。

my $backtrace = Backtrace.new;
say $backtrace.full;

方法 list§

multi method list(Backtrace:D:)

返回此回溯的 Backtrace::Frame 对象的列表。

方法摘要§

method summary(Backtrace:D: --> Str:D)

返回通过 !.is-hidden && (.is-routine || !.is-setting) 过滤的回溯的摘要字符串表示形式。

此程序

sub inner { say Backtrace.new.summary }
sub outer { inner}
outer;

生成

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

方法 concise§

method concise(Backtrace:D:)

返回通过 !.is-hidden && .is-routine && !.is-setting 过滤的回溯的简洁字符串表示形式。

此程序

sub inner { say Backtrace.new.concise }
sub outer { inner}
outer;

生成

in sub inner at test.raku line 1
in sub outer at test.raku line 2

方法 map§

multi method map(Backtrace:D: &block --> Seq:D)

它对每个元素调用 &block,并收集返回值并返回一个序列。

此程序

sub inner { Backtrace.new.map({ say "{$_.file}{$_.line}" }); }
sub outer { inner}
outer;

生成

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

方法 flat§

multi method flat(Backtrace:D:)

返回与 list 相同的回溯。

类型图§

Backtrace 的类型关系
raku-type-graph Backtrace Backtrace Any Any Backtrace->Any Mu Mu Any->Mu

展开上面的图表