我一直在尝试编写一个执行以下逻辑的 Perl 6 表达式:计算子表达式并返回其值,但如果这样做会导致引发异常,则捕获异常并返回固定值。
例如,假设我想除两个数字并使表达式计算为-1
如果发生错误。在 Ruby 中我可能会这样写:
quotient = begin; a / b; rescue; -1; end
在 Emacs Lisp 中可以写成:
(setq quotient (condition-case nil (/ a b) (error -1))
我的第一次 Perl 6 尝试是这样的:
sub might-throw($a, $b) { die "Zero" if $b == 0; $a / $b }
my $quotient = do { might-throw($a, $b); CATCH { default { -1 } } };
但在这儿$quotient
最终结果是未定义的,无论是否$b
为零。
看起来返回的值是CATCH
被忽略,或者至少在doc page描述了异常是如何工作的,所有的CATCH
身体只做有副作用的事情,比如伐木。
该页面提到try
作为备选。例如我可能会写:
my $quotient = try { might-throw($a, $b) } // -1;
我发现这是一个相当平庸的解决方案。一方面,我正在评估的表达式可能确实具有未定义的值,并且我无法将其与引发异常的情况区分开来。另一方面,我可能想根据抛出的异常的类回退到不同的值,但是try
只是把它们全部吞掉。我可以放我自己的CATCH
块在try
来区分异常,但随后我又回到了上面的第一种情况,其中来自CATCH
被忽略。
Perl 6 的异常处理可以像我上面表达的那样进行吗?
EDIT:
当前的答案内容丰富,但过于狭隘地关注除法运算符的语义。我稍微重写了这个问题,以使异常捕获的主要问题更加核心。