从Perl 6中的异常处理程序返回值

前端之家收集整理的这篇文章主要介绍了从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.

猜你在找的Perl相关文章