与Moose,Try :: Tiny和TryCatch的奇怪行为

时间:2011-06-16 00:08:39

标签: perl moose

我刚刚开始与Moose合作,遇到了一个我无法弄清楚的奇怪问题。以下代码:

#!/usr/bin/env perl
use strict;
use warnings;
use Try::Tiny;

{
    package Foo;
    use Moose;
    has x => ( is => 'ro', isa => 'Int' );
}

my $f; 
try {
    $f = Foo->new(x => 'x');
} catch {
    die "oops\n";
}
print $f->x . "\n";

产生

Can't call method "x" on an undefined value at m2.pl line 19.

但是,如果我将Try::Tiny替换为TryCatch,它就像我认为的那样:

oops

即使x是正确的值,例如5Try::Tiny仍会产生undefined value错误。

由于我一直在阅读的所有Moose文档都使用Try::Tiny,我对此代码无效的原因感到非常困惑。我在这里做错了吗?

2 个答案:

答案 0 :(得分:16)

Try::Tiny在try / catch节结束时需要分号:

try {
    $f = Foo->new(x => 'x');
} catch {
    die "oops\n";
};

这是由于Try::Tiny的实施 - trycatch都只是功能。

答案 1 :(得分:4)

尝试{...} catch {...}不是内置的(因为它是由模块提供的)。在perl 5中,这意味着你必须用分号结束它:

try {
    $f = Foo->new(x => 'x');
} catch {
    die "oops\n";
};
print $f->x . "\n";

我无法回答TryCatch如何设法处理丢失的分号 - 但可以使用各种黑魔法:)

相关问题