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
相关产品推荐
相关产品推荐

