当前位置: 首页 > 知识库问答 >
问题:

我应该在哪里捕获Perl 6警告控件异常?

潘泰
2023-03-14

我正在处理Perl 6的控制异常。警告会引发正常异常控制流不可见的控制异常,该异常会自行恢复。那有点酷。

所以,我写了这个来看看会发生什么。除了了解Perl 6的实际功能外,我不想解决特定的问题:

use v6;

try {
    CONTROL {
        put "Caught an exception, in the try";
        put .^name;
        }
    do-that-thing-you-do();
    }

sub do-that-thing-you-do {
    CONTROL {
        put "Caught an exception, in the sub";
        put .^name;
        }
    warn "This is a warning";
    }

它看起来像两个火:

Caught an exception, in the sub
CX::Warn
Caught an exception, in the try
CX::Warn
This is a warning
  in sub do-that-thing-you-do at resume.p6 line 16
MoarVM panic: Trying to unwind over wrong handler

注意,有一种莫阿恐慌,我已经提出了一个问题。但是,我并不是真的在问这个问题。

我对这里的水流图很好奇。我希望sub中的控件能够捕获异常并恢复,这样它就不会渗透到try。这应该如何进行?

另外,请注意异常是CX::Warn。我不认为我做了什么奇怪的事情,但是Perl 6类型甚至没有列出X::Warn

共有1个答案

芮朗
2023-03-14

要获得与默认警告处理程序相同的行为,则必须捕获异常(与捕获一样,不带智能匹配的控件将重新抛出)并在异常之后继续执行。

CONTROL {
    when CX::Warn {
        say "Warning: $_";
        .resume
    }
}

sub foo() {
    say 1;
    warn 'oh gosh...';
    say 2;               # Not reached without .resume
}
foo();

还有许多其他控制异常,因此明智的做法是只匹配CX::Warn,而不是使用默认。否则,处理程序可以对ake下一个最后一个emit完成(并且,在6. d中,可能还会对wait)进行网络处理,这肯定会使相当头痛。

 类似资料:
  • 我有一个Spring项目和一个MongoRepository。MongoRepository是一个扩展MongoRepository的接口,就像JPA一样。 Exception={com.mongoDB.mongoSocketOpenException:打开套接字异常},由{java.net.connectException:连接被拒绝:connect}引起 有办法捕捉异常吗?我无法在调用我的存储

  • 问题内容: 在我的python脚本中,我想使用MySql捕获“我的查询截断了列’xxx’的数据”警告。 我看到了一些建议以下代码的帖子,但它不起作用。 您是否知道在使用此代码之前是否必须导入某些特定模块或是否应调用某些选项/标志? 谢谢大家 阿菲格 问题答案: 警告仅仅是:警告。他们被报告给(通常)stderr,但是没有做其他事情。您不能像异常一样捕获它们,因为它们没有被引发。 你可以,但是,配置

  • 问题内容: 我使用netfishs 6.7.1和glassfish v2.1编写了一个Web服务项目,将log4j.properties放入项目的根目录并使用: 在构造函数中: 在功能上: 但是,这是错误信息(实际上,我已经尝试将它几乎可以实现的每个目录都放入): 问题答案: 我知道回答这个问题有点晚了,也许您已经找到了解决方案,但是我将发布我找到的解决方案(在我进行大量Google搜索之后),因

  • 问题内容: API文档说永远不要捕获 Throwable 子类 错误 ,这表示异常行为。这是否意味着错误和异常之间的隔离是为了告诉程序员应该捕获哪个子类,而不应该捕获哪个子类?还是还有更多呢? 问题答案: 通常,这是严重错误(通常 在平台本身内部 ),您无法想象得到处理。我曾经关心醒目的唯一时间是为了 记录它 ,下面我再重新抛出。 这是非常重要的,因为它很容易让错误(和运行时异常),以这样的方式,

  • 我有一个SQL语句,我希望它返回一行,因为我正在传递主键。所以我的选择是 将queryForObject包装为try/catch,捕获EmptyResultDataAccessException,并返回null 将调用更改为queryForList,然后展开列表,并(希望)返回第一个元素,或null 我在某个地方读到过,将EmptyResultDataAccessException作为cathin

  • 我搜索了很多,几乎所有我发现的例子都使用了控制器中的异常处理和自己的异常处理程序。我一直认为这应该在程序的服务层上完成。如果不是,我真的不明白为什么要创建单独的服务层。 另外,如果我在Controller中实现异常处理,是否意味着我必须在前面的所有层中抛出异常?