Странное поведение с Moose, Try :: Tiny и TryCatch - PullRequest
8 голосов
/ 16 июня 2011

Я только начал работать с 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, я очень озадачен, почему этот код не работает. Я что-то здесь не так делаю?

Ответы [ 2 ]

16 голосов
/ 16 июня 2011

Try::Tiny требует точки с запятой в конце раздела try / catch:

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

Это связано с реализацией Try::Tiny - try и catch.функции.

4 голосов
/ 16 июня 2011

try {...} catch {...} не является встроенным (так как он предоставляется модулем). В Perl 5 это означает, что вы должны завершить его точкой с запятой, например:

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

Я не могу ответить, как TryCatch удается обработать пропущенную точку с запятой - но это возможно с использованием различной черной магии:)

...