区分CATCH块中的异常与失败[RAKU]

我们知道,可以通过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块中的“失败”和“正常”异常?

乔纳森·沃辛顿

之间的关系Failure,并Exception是一个Failure有一个Exception-也就是说,它拥有异常对象作为其状态的一部分。像这样:

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

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

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

为了完整起见,我将注意,有一些间接方法可以检测到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
    }
}

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在catch块中引发异常

来自分类Dev

catch块中的异常对象

来自分类Dev

异常未捕获在try catch块中

来自分类Dev

在catch块中引发相同的异常

来自分类Dev

在try / catch块中引发的异常(Java)

来自分类Dev

try / catch块中未处理的异常

来自分类Dev

在 try/catch 块中未捕获异常

来自分类Dev

我如何在C ++中的catch块中处理异常

来自分类Dev

C#-返回后在catch块中抛出异常

来自分类Dev

从catch内以及finally块中引发异常

来自分类Dev

Visual Studio 2015在Try Catch块中引发异常

来自分类Dev

未捕获的异常 PDOException 即使语句在 try/catch 块中

来自分类Dev

异常处理Try Catch块

来自分类Dev

catch块内的Java异常

来自分类Dev

如何挽救 ruby 异常,而不是代码块中的失败

来自分类Dev

在C#中传播在finally块中引发的异常而不会从catch块中丢失异常的最佳实践是什么?

来自分类Dev

从具有嵌套异常的catch块中抛出异常可以吗?

来自分类Dev

是否可以从具有嵌套异常的catch块中抛出异常?

来自分类Dev

尽管执行捕获在catch块中,导致try / catch块未能进行异常处理的原因是什么?

来自分类Dev

try块引发异常,但catch块未捕获异常

来自分类Dev

Lamdas绕过try / catch块以检查异常

来自分类Dev

成语,让特定的异常绕过广泛的catch块?

来自分类Dev

@ try @ catch块未捕获异常内部

来自分类Dev

在前一个catch块中处理的重新抛出异常

来自分类Dev

用Java捕获Scala中抛出的异常-无法访问的catch块

来自分类Dev

仅在try和catch块中没有引发异常的情况下,Java运行代码?

来自分类Dev

catch块未在另一个线程中捕获异常

来自分类Dev

找出哪个实例在try-catch块中引发了异常

来自分类Dev

如何记录没有try / catch块的单元测试中引发的异常?

Related 相关文章

  1. 1

    在catch块中引发异常

  2. 2

    catch块中的异常对象

  3. 3

    异常未捕获在try catch块中

  4. 4

    在catch块中引发相同的异常

  5. 5

    在try / catch块中引发的异常(Java)

  6. 6

    try / catch块中未处理的异常

  7. 7

    在 try/catch 块中未捕获异常

  8. 8

    我如何在C ++中的catch块中处理异常

  9. 9

    C#-返回后在catch块中抛出异常

  10. 10

    从catch内以及finally块中引发异常

  11. 11

    Visual Studio 2015在Try Catch块中引发异常

  12. 12

    未捕获的异常 PDOException 即使语句在 try/catch 块中

  13. 13

    异常处理Try Catch块

  14. 14

    catch块内的Java异常

  15. 15

    如何挽救 ruby 异常,而不是代码块中的失败

  16. 16

    在C#中传播在finally块中引发的异常而不会从catch块中丢失异常的最佳实践是什么?

  17. 17

    从具有嵌套异常的catch块中抛出异常可以吗?

  18. 18

    是否可以从具有嵌套异常的catch块中抛出异常?

  19. 19

    尽管执行捕获在catch块中,导致try / catch块未能进行异常处理的原因是什么?

  20. 20

    try块引发异常,但catch块未捕获异常

  21. 21

    Lamdas绕过try / catch块以检查异常

  22. 22

    成语,让特定的异常绕过广泛的catch块?

  23. 23

    @ try @ catch块未捕获异常内部

  24. 24

    在前一个catch块中处理的重新抛出异常

  25. 25

    用Java捕获Scala中抛出的异常-无法访问的catch块

  26. 26

    仅在try和catch块中没有引发异常的情况下,Java运行代码?

  27. 27

    catch块未在另一个线程中捕获异常

  28. 28

    找出哪个实例在try-catch块中引发了异常

  29. 29

    如何记录没有try / catch块的单元测试中引发的异常?

热门标签

归档