我试图solve this issue,this page is wrong中提及X::TypeCheck::Splice
例外情况的说明。这是代码:
use experimental :macros;
CATCH {
# will definitely catch all the exception
default { say .^name, " → ", .Str; }
}
macro a { 'foo' };
say a;
我已将其扩展为包含CATCH
块。但是,会抛出异常:
===SORRY!===
Too few positionals passed; expected 3 arguments but got 2
但是,我不知道它是否是正确的类型,因为它没有被CATCH块捕获。我还尝试将该块插入CHECK
或BEGIN
阶段,这些阶段在编译时发生,但无济于事。有什么想法吗?
显然,其他语言如clojure let the macro handle its own exception。这似乎不适用于此;在宏定义中插入CATCH块会抛出一个WARNING,并且有一些工作(会打印Nil
),这可能意味着它正在捕获异常,但仍然不会打印异常类型。
答案 0 :(得分: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")
正如您所看到的,至少在此版本中,它是一个“无类型”异常。这些也可以来自VM内部,其中更细微的错误处理并不像Perl 6或NQP代码那样容易。