从Perl 6中的异常处理程序返回值
我一直在尝试编写一个执行以下逻辑的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的异常处理可以像我所表达的那样,我希望它能够在上面做吗? 编辑: 目前的答案是提供信息的,但是过于狭隘地关注除法运算符的语义.我稍微改写了这个问题,使异常的主要问题更加重要. 解决方法
你的catch块不起作用的原因是因为除以零并不是一个错误. Perl6很乐意让你除以零并将该值存储为Rat.当你想以有用的方式展示所述老鼠时(IE说它)就会出现这个问题.当你得到一个失败的时候,如果没有处理就会变成和异常.
所以你有几个选择.你可以在赚钱之前检查$b: $q = $b == 0 ?? -1 !! $a / $b; 或者,如果你想保持真实值(注意你可以反省鼠的分子和分母而不会导致除零错误)当你说它时你可以使用.perl或.Num版本. 两者都给出了Rat的十进制表示,其中.perl给出< 1/0>当你有0分母时,.Num给出Inf. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |