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

时间:2018-04-28 10:27:57

标签: exception compilation perl6

我试图solve this issuethis 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块捕获。我还尝试将该块插入CHECKBEGIN阶段,这些阶段在编译时发生,但无济于事。有什么想法吗?

显然,其他语言如clojure let the macro handle its own exception。这似乎不适用于此;在宏定义中插入CATCH块会抛出一个WARNING,并且有一些工作(会打印Nil),这可能意味着它正在捕获异常,但仍然不会打印异常类型。

1 个答案:

答案 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代码那样容易。