2011-06-16 22 views
8

Ho appena iniziato a lavorare con Moose e ho incontrato uno strano problema che non riesco a capire. Il codice seguente:Comportamento anomalo con Moose, Try :: Tiny e TryCatch

#!/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"; 

produce:

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

Tuttavia, se sostituisco Try::Tiny con TryCatch, agisce come Supporrei dovrebbe:

oops 

Anche se x è il il valore corretto, ad esempio 5, Try::Tiny produce ancora l'errore undefined value.

Poiché tutta la documentazione di Moose che ho letto utilizza Try::Tiny, sono molto confuso sul motivo per cui questo codice non funziona. Sto facendo qualcosa di completamente sbagliato qui?

risposta

16

Try::Tiny richiede un punto e virgola alla fine di una strofa try/catch:

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

Ciò è dovuto alla realizzazione di Try::Tiny - try e catch sono entrambi a pochi funzioni.

+0

Gah, un aspetto imbarazzante. Grazie! – Joe

+2

+1 per l'uso fantastico di * stanza *. – FMc

4

try {...} catch {...} non è un builtin (poiché è fornito da un modulo). In Perl 5 questo significa che si deve finire con un punto e virgola in questo modo:

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

Non posso rispondere come TryCatch riesce a gestire il punto e virgola mancante - ma è possibile utilizzando vari magia nera :)

+8

TryCatch utilizza Devel :: Declare per modificare il parser. Crea effettivamente nuove regole di analisi per il blocco try/catch piuttosto che in base all'utilizzo creativo di prototipi e sottotitoli anonimi. – perigrin

+1

Devel :: Declare ha alcune controversie associate al problema "Troppa magia": http://www.perlmonks.org/?node_id=832796 – daotoad

Problemi correlati