Recientemente comencé con Moose y es un gran marco de OO no solo para usar sino también para aprender nuevos conceptos de OO. Una de las cosas que quería hacer era hacer informes de errores desde la perspectiva de la persona que llama durante la creación del objeto. Vi que Moose tiene el módulo Moose :: Error :: Croak que le dice a Moose que anule el informe de error predeterminado por croak call. Lo utilicé pero no parece ayudarMoose :: Error :: Informe de errores Croak no desde la perspectiva de la persona que llama
código alces - 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;
código alces - fooser.pl
#!/usr/bin/perl
use strict;
use warnings;
use Foo;
my $foobj = Foo->new();
Esta falla con el error: Atributo (attr1) es obligatorio en /usr/local/lib/perl/5.8.8/Class/MOP/Class.pm línea 364
que es elíptico que el seguimiento de la pila real si Moose :: Error :: Croak no se utiliza. Pero no lo informa desde la perspectiva de la persona que llama. Si esto fuera un código OO Perl 5 y tuve Foo.pm como:
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;
Y si fooser.pl fue ejecutado Me habría conseguido el error:
"ERR: no proporcionó attr1 en fooser .pl línea 6 "
que es desde la perspectiva de la persona que llama, ya que apunta a la línea no. 6 de fooser.pl en lugar de la línea de MOP.pm no. 364.
¿Cómo puedo hacer esto en Moose? ¿O estoy malentendiendo algo aquí?
Use confess en lugar de croak. Cual es el predeterminado – jrockway
El valor predeterminado no ayuda. Da una traza entera con la última entrada que es la persona que llama. Cuando estoy registrando errores, no es útil registrar seguimientos de nivel de alce si hay un error en mi llamada. –