Moose :: Error :: Сообщение об ошибке Croak не с точки зрения вызывающей стороны - PullRequest
7 голосов
/ 02 мая 2010

Я только недавно начал на Moose и его отличной OO-среде не только для использования, но и для изучения новых OO-концепций. Одна из вещей, которую я хотел сделать, - создавать отчеты об ошибках с точки зрения вызывающей стороны во время создания объекта. Я видел, что у Moose есть модуль Moose :: Error :: Croak, который говорит Moose переопределить отчеты об ошибках по умолчанию при вызове croak. Я использовал это, но это не помогло

Код 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;

код Moose - fooser.pl

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

Это не с ошибкой: Атрибут (attr1) необходим в строке /usr/local/lib/perl/5.8.8/Class/MOP/Class.pm 364

, что меньше, чем фактическая трассировка стека, если Moose :: Error :: Croak не используется. Но это не сообщает об этом с точки зрения абонента. Если бы это был код Perl 5 OO и у меня был Foo.pm как:

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;

И если fooser.pl был запущен, я получил бы ошибку:

"ОШИБКА: не предоставил attr1 в строке 6 fooser.pl"

, что с точки зрения вызывающего абонента, поскольку оно указывает на строку №. 6 из файла fooser.pl, а не строки MOP.pm. 364.

Как я могу сделать это в Музе? Или я что-то здесь неправильно понимаю?

1 Ответ

4 голосов
/ 02 мая 2010

Один из вариантов - использовать MooseX :: Constructor :: AllErrors .

Этот модуль собирает ошибки конструктора и печатает их все вместе (поведение по умолчанию - смерть, как только обнаружится первая ошибка). У него есть побочный эффект печати с точки зрения абонента.

Замените ваш use metaclass на use MooseX::Constructor::AllErrors;, и ошибка станет:

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

Однако, если вы вызовете Foo->new из другого модуля (например, Bar) и вызовете Bar->new в своем скрипте, ошибка будет выглядеть примерно так:

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

... так что это не полное решение.

...