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

标签 perl error-handling catalyst dbix-class template-toolkit

处理 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/

相关文章:

perl - 我在哪里可以找到 Template Toolkit 的 'more advanced web toolkit'?

perl - 是否有使用 HTML::Template 而不是 TT 的 Catalyst 教程?

perl - 将Catalyst应用程序部署到生产服务器的最佳实践是什么?

object - 克隆VBScript Err对象

php - 警告: count(): Parameter must be an array or an object that implements Countable in C:\xampp\htdocs\m2\my booking.php on line 158

string - 如何使用 Perl 根据条件修改字符串的最后两个字符

Python - 解压列表并连接成一个字符串

php - 检测空的子数组-无效的foreach

perl - 庆典 : cpan: command not found

perl - 来 self 的 Perl 脚本的系统调用截断了地址