gpt4 book ai didi

exception - 区分CATCH block 中的异常与失败[RAKU]

转载 作者:行者123 更新时间:2023-12-03 16:00:12 25 4
gpt4 key购买 nike

我们知道,可以通过CATCH块来处理故障。

在下面的示例中,我们在“other-sub”中创建一个“AdHoc”失败,并在CATCH块中(在“my-sub”中)处理异常。

sub my-sub {
try {
CATCH {
when X::AdHoc { say 'AdHoc Exception handled here'; .resume }
default {say 'Other Exception'; .resume}
}

my $b = other-sub();

$b.so ?? $b.say !! 'This was a Failure'.say;
}
}

sub other-sub { fail 'Failure_X' }

my-sub();

输出如下:
AdHoc Exception handled here
This was a Failure

但是我的问题是:如何区分CATCH块中的失败和“正常”异常,以便区分这两种情况?

最佳答案

FailureException之间的关系是Failure具有Exception-也就是说,它将异常对象作为其状态的一部分保存。像这样的东西:

class Failure {
has Exception $.exception;
# ...
}

Failure“爆炸”时,它会通过抛出其中的 Exception来实现。因此,到达 CATCH块的是 Exception对象,并且没有链接返回到封闭的 Failure。 (实际上,给定的 Exception对象原则上可以由许多 Failure持有。)

因此,没有直接的方法可以检测到这一点。从设计的角度来看,您可能不应该这样做,应该找到解决问题的另一种方法。 Failure只是一种推迟引发异常并将其视为值的方式。这并不意味着根本问题的性质会发生变化,因为它是作为一个值而不是作为控制流的立即传递来传达的。不幸的是,最初的目标并未在问题中阐明。您可能会发现查看控件异常很有用,但否则可能会发布另一个有关您要解决的基本问题的问题。可能有更好的方法。

为了完整起见,我将注意到,有一些间接的方法可以检测 Exception抛出了 Failure。例如,如果获取异常对象的 .backtrace并查看顶部框架的包,则可以确定它来自 Failure:
sub foo() { fail X::AdHoc.new(message => "foo") }
try {
foo();
CATCH {
note do { no fatal; .backtrace[0].code.package ~~ Failure };
.resume
}
}

但是,这在很大程度上取决于可以轻松更改的实现细节,因此我不会依赖它。

关于exception - 区分CATCH block 中的异常与失败[RAKU],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59983325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com