Как получить лучшее сообщение об ошибке, если в Moose не указан обязательный атрибут? - PullRequest
8 голосов
/ 19 апреля 2011

Я новичок в Музе.До сегодняшнего дня наши среды работали на Perl 5.8.2, который не поддерживал Moose.

Я работаю над некоторыми примерами и думал, что настройка «required => 1» для атрибута будет полезнаОднако, когда я пытаюсь использовать эту опцию, возвращаемое сообщение об ошибке в действительности не используется.

Вот пример:

cat.pl:

#!/usr/bin/perl

{
    package Cat;
    use Moose;
    use Modern::Perl;

    has 'name' => (
        is => 'ro',
        required => 1,
    );
    sub meow {
        my $self = shift;
        say 'Meow!';
    }
}

use Modern::Perl;

my $alarm = Cat->new();
$alarm->meow();
$alarm->meow();
$alarm->meow();

КогдаЯ запускаю его:

Attribute (name) is required at /app/perl5/perl-5.10.1/lib/site_perl/5.10.1/aix-thread-multi-64all/Class/MOP/Class.pm line 581
        Class::MOP::Class::_construct_instance('Moose::Meta::Class=HASH(0x110ac1a00)', 'HASH(0x110c3b3c0)') called at /app/perl5/perl-5.10.1/lib/site_perl/5.10.1/aix-thread-multi-64all/Class/MOP/Class.pm line 554
        Class::MOP::Class::new_object('Moose::Meta::Class=HASH(0x110ac1a00)', 'HASH(0x110c3b3c0)') called at /app/perl5/perl-5.10.1/lib/site_perl/5.10.1/aix-thread-multi-64all/Moose/Meta/Class.pm line 258
        Moose::Meta::Class::new_object('Moose::Meta::Class=HASH(0x110ac1a00)', 'HASH(0x110c3b3c0)') called at /app/perl5/perl-5.10.1/lib/site_perl/5.10.1/aix-thread-multi-64all/Moose/Object.pm line 28
        Moose::Object::new('Cat') called at cat.pl line 20

Если один из наших не-perl-операторов увидит подобное сообщение об ошибке, они, вероятно, сойдут с ума.Боюсь, они не поймут, что все 5 строк в сообщении об ошибке на самом деле являются частью одной и той же ошибки.

Есть ли способ получить хорошее сообщение об ошибке, если не указан обязательный атрибут?

Что-то вроде хрипоты, я могу представить себе следующее сообщение:

Attribute (name) is required at cat.pl line 20

Опять же, я новичок в Moose, так что это может быть простой настройкой, которую мне не хватает.1021 * Заранее спасибо!

Ответы [ 3 ]

5 голосов
/ 19 апреля 2011

Я думаю, что, возможно, нашел решение для моего требования, но я не уверен, что это лучшее решение.

И, как указывает @Tanktalus, полезно иметь подробное сообщение об ошибке.

Для моего вопроса расширение MooseX :: Constructor :: AllErrors работает:

#!/usr/bin/perl

{
    package Cat;
    use Moose;
    use MooseX::Constructor::AllErrors;
    use Modern::Perl;

    has 'name' => (
        is => 'ro',
        required => 1,
    );
    sub meow {
        my $self = shift;
        say 'Meow!';
    } 
}

use Modern::Perl;

my $alarm = Cat->new(); 
$alarm->meow(); 
$alarm->meow(); 
$alarm->meow();

При запуске я получаю:

Attribute (name) is required at cat.pl line 21

О чем я и думал.

Поскольку я совсем не знаком с Moose, можно ли использовать это расширение или оно "заглушит" все сообщения об ошибках?

2 голосов
/ 19 апреля 2011

Я предпочитаю длинное сообщение об ошибке - потому что, если мне не хватает обязательного параметра, я хочу, чтобы моих пользователей, не являющихся Perl, взбесились: я явно что-то упустил в разработке, модульном тесте и системе проверьте, не доходит ли он до пользователя с таким типом сообщения.

Имейте в виду, я также оставляю смертельные предупреждения включенными, когда я иду в производство. Я предпочитаю, чтобы мои неудачи были впечатляющими, поэтому я не могу случайно их игнорировать.

0 голосов
/ 26 сентября 2011

Поскольку требуется имя, вам нужно заполнить этот атрибут из конструктора.Как это:

my $alarm = Cat->new({'name' => 'Sylvester'});

Это должно решить вашу проблему.

...