You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl 6中如何打印抛出的异常类型(含编译时)及异常排查

解决Perl 6编译时异常捕获与类型查看问题

咱们一步步拆解你遇到的问题:

为什么你的CATCH块抓不到异常?

你碰到的Too few positionals passed是编译时异常,而普通的CATCH是给运行时异常准备的——编译阶段你的代码还没执行到CATCH块呢,自然没法捕获它。这是Perl 6里编译时和运行时异常的核心区别,得用不同的机制处理。

怎么查看编译时异常的具体类型?

要捕获并打印编译时异常的类型,得用BEGIN块配合CONTROL块。BEGIN块会在编译阶段就执行,而CONTROL专门用来处理编译时的异常信号。试试这段代码:

use experimental :macros;

BEGIN {
    CONTROL {
        when CX::Comp {
            say "编译时异常类型: ", .^name;
            say "异常详情: ", .Str;
            # 如果你想让编译继续(可能会有后续错误),可以调用.resume
            .resume;
        }
    }
}

macro a { 'foo' };
say a;

这里的CX::Comp是所有编译时异常的基类,运行后你就能看到具体的异常类型了。

关于X::TypeCheck::Splice异常描述的问题

你提到这个异常的描述有误,结合你遇到的参数不足问题,根源应该是宏的写法不对。Perl 6的宏返回值得是AST节点,而不是普通字符串。你写的macro a { 'foo' }返回的是字符串,编译器没法正确解析成语法树,所以才抛出了参数错误的异常。正确的写法应该返回AST构造的代码,比如:

macro a { Q { 'foo' } };

用Q { ... }把字符串包装成AST节点,这样你的代码就能正常运行,不会再触发那个异常了。

小总结:异常处理的区别

  • 运行时异常:用CATCH块处理,代码执行阶段触发。
  • 编译时异常:用BEGIN块里的CONTROL块处理,编译阶段触发,所有编译时异常都属于CX::Comp的子类。

内容的提问来源于stack exchange,提问作者jjmerelo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:19:04