加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 21:15:22 所属栏目:大数据 来源:网络整理
导读:如果我有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强制从调用者例程
如果我有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阻止调用它的代码继续,那么它似乎不太可能清理它以使延续成为可能,并且再一次,它将导致令人讨厌的,难以调试的意外,为将来的程序员使用这个码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读