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阻止调用它的代码继续,那么它似乎不太可能清理它以使延续成为可能,并且再一次,它将导致令人讨厌的,难以调试的意外,为将来的程序员使用这个码.