在Perl 6中,如何在编译时打印抛出的Exceptions类型?

jjm*_*elo 5 compilation exception perl6

我正在尝试解决此问题,该问题提到此页面中X::TypeCheck::Splice异常描述是错误的.这是代码:

use experimental :macros;
CATCH {
    # will definitely catch all the exception 
    default { say .^name, " ? ", .Str; }
}

macro a { 'foo'  };
say a;
Run Code Online (Sandbox Code Playgroud)

我已经扩展到包括CATCH块.但是,会抛出异常:

===SORRY!===
Too few positionals passed; expected 3 arguments but got 2
Run Code Online (Sandbox Code Playgroud)

但是,我不知道它是否是正确的类型,因为它没有被CATCH块捕获.我也尝试将该块插入CHECKBEGIN在编译时发生的阶段,但无济于事.任何的想法?

显然,像clojure这样的其他语言让宏处理它自己的异常.这似乎不适用于此; 在宏定义中插入CATCH块会抛出一个WARNING,并且有一些工作(会打印Nil),这可能意味着它正在捕获异常,但仍然不会打印异常类型.

tim*_*imo 5

通过EVAL运行代码将在eval sub的运行时抛出编译时警告

EVAL q/use experimental :macros; macro a { "foo" }; say a/;
CATCH { default { .perl.say } };
# X::AdHoc.new(payload => "Too few positionals passed; expected 3 arguments but got 2")
Run Code Online (Sandbox Code Playgroud)

如您所见,至少在这个版本中它是一个"无类型"的例外.这些也可以来自VM内部,其中更细致的错误处理并不像Perl 6或NQP代码那样容易.