我一直在尝试编写一个执行以下逻辑的Perl 6表达式:计运算符表达式并返回其值,但如果这样做会导致引发异常,请捕获异常并返回固定值.
例如,假设我想要分割两个数字,并且如果发生错误,则将表达式evaluate计算为-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主体仅执行具有副作用的事情,例如日志记录.
该页面提到尝试作为替代方案.我可以写一些例子:
my $quotient = try { might-throw($a,$b) } // -1;
我觉得这是一个相当平庸的解决方案.首先,我正在评估的表达式可能真的具有未定义的值,我无法将其与抛出异常的情况区分开来.另一方面,我可能希望根据抛出的异常的类别回退到不同的值,但尝试只是吞下它们.我可以将自己的CATCH块放在try中以区分异常,但后来我回到上面的第一种情况,其中来自CATCH的值被忽略.
Perl 6的异常处理可以像我所表达的那样,我希望它能够在上面做吗?
编辑:
目前的答案是提供信息的,但是过于狭隘地关注除法运算符的语义.我稍微改写了这个问题,使异常的主要问题更加重要.