我刚刚开始与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
是正确的值,例如5
,Try::Tiny
仍会产生undefined value
错误。
由于我一直在阅读的所有Moose文档都使用Try::Tiny
,我对此代码无效的原因感到非常困惑。我在这里做错了吗?
答案 0 :(得分:16)
Try::Tiny
在try / catch节结束时需要分号:
try {
$f = Foo->new(x => 'x');
} catch {
die "oops\n";
};
这是由于Try::Tiny
的实施 - try
和catch
都只是功能。
答案 1 :(得分:4)
尝试{...} catch {...}不是内置的(因为它是由模块提供的)。在perl 5中,这意味着你必须用分号结束它:
try {
$f = Foo->new(x => 'x');
} catch {
die "oops\n";
};
print $f->x . "\n";
我无法回答TryCatch如何设法处理丢失的分号 - 但可以使用各种黑魔法:)