我对穆斯来说是全新的。直到今天,我们的环境都在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行实际上都是同一错误的一部分。
如果没有提供必需的属性,有没有办法获得一个很好的错误消息?
像croak这样的东西,我可以想象这样的信息:
Attribute (name) is required at cat.pl line 20
同样,我是Moose的新手,所以这可能是一个我很想念的简单设置。
提前致谢!
答案 0 :(得分:5)
我想我可能找到了解决方案,但我不确定它是否是最佳解决方案。
而且,正如@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一点都不熟悉,这个扩展是否可以使用,还是会“消除”所有错误信息?
答案 1 :(得分:2)
我更喜欢长错误消息 - 因为如果我缺少必需的参数,我想要我的非perl用户吓坏了:我显然错过了开发,单元测试和系统测试是否一直带给具有此类消息的用户。
请注意,我在开始制作时也会发出致命的警告。我更喜欢我的失败是壮观的,所以我不能无意中忽略它们。
答案 2 :(得分:0)
由于需要“name”,您需要做的是从构造函数中填充此属性。像这样:
my $alarm = Cat->new({'name' => 'Sylvester'});
这可以解决您的问题。