Perl子例程是否有可能强制其调用者返回?

前端之家收集整理的这篇文章主要介绍了Perl子例程是否有可能强制其调用者返回?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我有Perl模块就好
package X;

和像这样的对象

my $x = X->new ();

在X.pm中,我为$x写了一个名为handle_error的错误处理程序,我称之为

sub check_size
 {
     if ($x->{size} > 1000) {
         $x->handle_error ();
         return;
     }
 }

有没有办法让handle_error强制从调用者例程返回?换句话说,在这个例子中,我可以让handle_error在check_size中返回而不实际写回来吗?

解决方法

调用堆栈中回溯多个级别的唯一合理方法是抛出异常/死亡.

那就是说,你真的应该重新考虑你想做什么.程序员(包括你自己,从现在起六个月)将期望,当函数调用完成后,它将执行后的语句(除非抛出异常).违反该期望将导致在handle_error中引起的错误,但似乎与调用handle_error的代码一起使用,使得它们极难调试.这不是一件好事.

您还假设绝对没有处理错误后继续进行的情况是合适的.硬编码这样的假设实际上是一个肯定的保证,一旦你有时间忘记它,你会遇到一个案例,你需要在调用handle_error后继续(然后浪费大量时间试图计算为什么handle_error之后的代码没有运行的原因).

然后假设您总是希望在调用堆栈中跳过两个级别.这是另一个假设,一旦硬编码就会失败.不仅会出现调用代码应该继续的情况,还有一些情况需要在调用堆栈中向上三级.

因此,只需通过调用die而不是return返回handle_error,并将异常捕获到执行应该继续的适当级别.你不知道sub将被调用的每个地方,所以你无法预测它需要多少级别.

在手头的代码中,如果额外的行只是说回来困扰你,你可以使用return $x-> handle_error;如果$x-> {size}>你甚至可以摆脱封闭范围并让它返回$x-> handle_error 1000;在那里 – 删除了三行而不是一行,加上一对括号和两对括号作为免费奖励.

最后,我还建议更改handle_error的名称以更好地反映它实际执行的操作. (也许是report_error?)“处理错误”通常意味着要清理以解决错误,以便继续执行.如果你希望你的handle_error阻止调用它的代码继续,那么它似乎不太可能清理它以使延续成为可能,并且再一次,它将导致令人讨厌的,难以调试的意外,为将来的程序员使用这个码.

原文链接:https://www.f2er.com/Perl/172820.html

猜你在找的Perl相关文章