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阻止调用它的代码继续,那么它似乎不太可能清理它以使延续成为可能,并且再一次,它将导致令人讨厌的,难以调试的意外,为将来的程序员使用这个码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Locality Sensitive Hashing ( LSH,局部敏感哈希 ) 详解
- NYOJ 205 求余数 (大数模拟求余)
- 大数相减
- 「原创」PHP两大框架:thinkphp真的比Laravel 5 垃圾吗?
- delphi命令行窗口实现9*9乘法表
- Grails OneToMany Set 排序
- php – $table-> string(‘some_text’)之间的区别; &$
- Learning Perl: 10.4. The Naked Block Control Structure
- HDU 1212 求大数余数
- delphi 函数参数传递 默认参数(传值)、var(传址)、out(输出