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?
Utilizzare confess invece di gracidare. Qual è l'impostazione predefinita. – jrockway
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. –