2010-05-02 11 views
7

Ho appena iniziato su Moose ed è un ottimo framework OO non solo da utilizzare ma anche per apprendere nuovi concetti OO. Una delle cose che volevo fare era fare report degli errori dal punto di vista del chiamante durante la creazione dell'oggetto. Ho visto che Moose ha il modulo Moose :: Error :: Croak che dice a Moose di ignorare la segnalazione degli errori di default tramite la chiamata di croak. L'ho usato, ma non è sembrato aiutareMoose :: Errore :: Segnalazione errori di Croak non dal punto di vista del chiamante

codice Moose - Foo.pm

package Foo; 
use metaclass (
    metaclass => 'Moose::Meta::Class', 
    error_class => 'Moose::Error::Croak', 
); 
use Moose; 
has 'attr1' => (
    is => 'rw', 
    isa => 'Str', 
    required => '1', 
); 
no Moose; 
1; 

codice Moose - fooser.pl

#!/usr/bin/perl 
use strict; 
use warnings; 
use Foo; 
my $foobj = Foo->new(); 

Questo viene a mancare con l'errore: Attribute (attr1) è richiesto in /usr/local/lib/perl/5.8.8/Class/MOP/Class.pm line 364

che è terso rispetto alla traccia di stack effettiva se Moose :: Error :: Croak non viene utilizzato. Ma non lo segnala dalla prospettiva del chiamante. Se questo fosse un codice OO Perl 5 e ho avuto Foo.pm come:

package Foo; 

use strict; 
use warnings; 
use Carp; 

sub new { 
    my ($class, %args) = @_; 
    my $self = {}; 
    if (! exists $args{'attr1'}) { 
    croak "ERR: did not provide attr1";  
    } 
    $self->{'attr1'} = $args{attr1}; 
    bless $self, $class; 
    return $self; 
} 
1; 

E se fooser.pl è stato eseguito avrei ottenuto l'errore:

"ERR: non ha fornito attr1 a fooser .pl line 6 "

che è dal punto di vista del chiamante in quanto punta alla riga n. 6 di fooser.pl piuttosto che la riga n. MOP.pm 364.

Come posso farlo in Moose? O sto fraintendendo qualcosa qui?

+0

Utilizzare confess invece di gracidare. Qual è l'impostazione predefinita. – jrockway

+1

Il valore predefinito non aiuta. Fornisce una traccia completa con l'ultima voce che è il chiamante. Quando si registrano errori, non è utile registrare le tracce di livello alce se l'errore è nella mia chiamata. –

risposta

4

Un'opzione è utilizzare MooseX::Constructor::AllErrors.

Questo modulo raccoglie gli errori del costruttore e li stampa tutti insieme (il comportamento predefinito è quello di morire non appena viene rilevato il primo errore). Ha un effetto collaterale della stampa dal punto di vista del chiamante.

Sostituisci il tuo use metaclass con use MooseX::Constructor::AllErrors; e l'errore diventa:

Attribute (attr1) is required at ./fooser.pl line 5 

Tuttavia, se si chiama Foo->new da dentro un altro modulo (ad es Bar) e chiamare Bar->new nello script, l'errore sarebbe più simile:

Attribute (attr1) is required at Bar.pm line 8 

... quindi non è una soluzione completa.

+0

Grazie per avermelo ricordato. Sebbene, Bar.pm non funzioni come previsto dal tuo post, almeno una chiamata diretta dovrebbe dare il comportamento desiderato. –

Problemi correlati