gpt4 book ai didi

perl - 如何处理 Perl 中方法链中的错误?

转载 作者:行者123 更新时间:2023-12-02 10:44:15 24 4
gpt4 key购买 nike

处理 Perl 中方法链接中抛出的异常的最佳方法是什么?如果任何链接的方法抛出异常,我想分配 0 或 undef 值

代码示例:

my $x = $obj->get_obj->get_other_obj->get_another_obj->do_something;

最好的方法是什么?我每次都必须用 try/catch/finally 语句换行吗?我想要应用这个的上下文是:我使用 Catalyst 和 DBIC 进行 Web 开发,并且我做了很多链接的结果集,如果其中一些结果集抛出异常,我只想分配一个值 0 或 undef,然后处理它模板中的错误(我正在使用模板工具包)。如果有另一种方法可以做到这一点,而不用将每个调用包装在 try/catch 中,请告诉我。如果您知道在相同上下文(Catalyst/DBIC/TT)中处理此类错误的更好方法,请提出建议。一个实际的例子是,当用户搜索某些内容但该内容不存在时。

最佳答案

我通过在失败时返回一个空对象来处理这个问题。该对象通过简单地返回自身来响应每个方法,因此它会继续这样做,直到耗尽剩余的方法。最后,您查看 $x 看看它是您期望的结果还是这个 null 对象。

这是一个这样的例子:

use v5.12;

package Null {
my $null = bless {}, __PACKAGE__;
sub DESTROY { 1 }
sub AUTOLOAD { $null }
}

对于调用的每个方法,AUTOLOAD 都会拦截它并返回空对象。

当您遇到错误时,您将返回这些 Null 对象之一。在方法链的中间,您仍然会返回一个对象,这样当您调用下一个方法时,Perl 就不会崩溃。

sub get_other_obj {
...;
return Null->new if $error;
...;
}

在链的末尾,您可以检查返回的内容以查看它是否为 Null 对象。如果这就是你所得到的,那么就发生了一些不好的事情。

这就是基本思想。您可以改进 Null 类,使其记住消息及其创建位置,或者添加一些多态方法(例如 sub is_success { 0 }),使其能够与您期望获得的对象。

我以为我在某处写过很长的内容,但现在找不到了。

更新:找到其中一些著作:

关于perl - 如何处理 Perl 中方法链中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7064975/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com