2010-05-02 8 views
7

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í?

+0

Use confess en lugar de croak. Cual es el predeterminado – jrockway

+1

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. –

Respuesta

4

Una opción es usar MooseX::Constructor::AllErrors.

Este módulo recopila errores de constructor e imprime todos juntos (el comportamiento predeterminado es morir tan pronto como se encuentre el primer error). Tiene un efecto secundario de impresión desde la perspectiva de la persona que llama.

reemplazar su use metaclass con use MooseX::Constructor::AllErrors; y el error se convierte en:

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

Sin embargo, si se llama a Foo->new desde el interior de otro módulo (por ejemplo bar) y llamar Bar->new en el script, el error sería más como:

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

... así que no es una solución completa.

+0

Gracias por señalar eso rjh. A pesar de que Bar.pm no funciona según lo previsto por su publicación, al menos una llamada directa debe dar el comportamiento deseado. –

Cuestiones relacionadas