nsb*_*sbm 10 error-handling perl catalyst template-toolkit dbix-class
在Perl链接方法中处理异常的最佳方法是什么?如果链接的任何方法抛出异常,我想分配值0或undef
代码示例:
my $x = $obj->get_obj->get_other_obj->get_another_obj->do_something;
Run Code Online (Sandbox Code Playgroud)
最好的办法是什么?我每次都必须在try/catch/finally语句中包装吗?我想要应用的上下文是:我正在使用Catalyst和DBIC进行Web开发,我做了很多链式结果集,如果这个结果集中的一些抛出异常,我只想分配0或undef的值,然后对待它模板中的错误(我使用Template Toolkit).如果还有另一种方法可以做到这一点而不包含try/catch中的每个调用,请告诉我.如果您知道在相同的上下文(Catalyst/DBIC/TT)中处理此类错误的更好方法,请建议.一个实际的例子是当用户搜索某些内容时,这不存在.
我通过在失败点返回一个null对象来处理这个问题.该对象通过简单地返回自身来响应每个方法,因此它一直这样做,直到它吃掉剩余的方法.最后,您查看$x它是否是您期望的结果或此null对象.
这是一个这样的例子:
use v5.12;
package Null {
my $null = bless {}, __PACKAGE__;
sub AUTOLOAD { $null }
}
Run Code Online (Sandbox Code Playgroud)
对于每个被调用的方法,AUTOLOAD都会拦截它并返回空对象.
当您遇到错误时,您将返回其中一个Null对象.在方法链的中间你仍然得到一个对象,所以当你调用下一个方法时Perl不会爆炸.
sub get_other_obj {
...;
return Null->new if $error;
...;
}
Run Code Online (Sandbox Code Playgroud)
在链的末尾,您可以检查您返回的内容,看它是否为Null对象.如果这就是你所得到的,就会发生一些不好的事情.
这是基本的想法.您可以改进Null类以使其记住消息及其创建位置,或者添加一些多态方法(例如sub is_success { 0 })以使其与您期望获得的对象的接口很好地协作.
我以为我已经在某个地方写了很长时间,但现在我找不到了.