Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl Moose::Error::Croak错误报告不从调用方的角度_Perl_Moose - Fatal编程技术网

Perl Moose::Error::Croak错误报告不从调用方的角度

Perl Moose::Error::Croak错误报告不从调用方的角度,perl,moose,Perl,Moose,我最近刚开始研究Moose,它是一个很棒的OO框架,不仅可以用来使用,还可以用来学习新的OO概念。我想做的事情之一是在对象创建期间从调用方的角度进行错误报告。我看到Moose有模块Moose::Error::Croak,它告诉Moose通过Croak调用覆盖默认的错误报告。我用过,但似乎没有用 驼鹿代码-Foo.pm package Foo; use metaclass ( metaclass => 'Moose::Meta::Class', error_class => '

我最近刚开始研究Moose,它是一个很棒的OO框架,不仅可以用来使用,还可以用来学习新的OO概念。我想做的事情之一是在对象创建期间从调用方的角度进行错误报告。我看到Moose有模块Moose::Error::Croak,它告诉Moose通过Croak调用覆盖默认的错误报告。我用过,但似乎没有用

驼鹿代码-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,我会得到错误:

“错误:未在fooser.pl第6行提供attr1”

这是从调用方的角度来看的,因为它指向fooser.pl的第6行,而不是MOP.pm的第364行

我怎样才能在驼鹿身上做到这一点?还是我误解了什么

一个选项是使用

此模块收集构造函数错误并将它们一起打印(默认行为是在遇到第一个错误时立即终止)。从调用方的角度来看,它具有打印的副作用

使用MooseX::Constructor::AllErrors替换
使用元类
时,错误变为:

Attribute (attr1) is required at ./fooser.pl line 5
但是,如果您从另一个模块(例如Bar)内部调用
Foo->new
,并在脚本中调用
Bar->new
,则错误更像:

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

…因此,这不是一个完整的解决方案。

使用坦白而不是咆哮。这是默认值。默认值没有帮助。它提供了一个完整的跟踪,最后一个条目是调用方。当我记录错误时,如果我的呼叫中有错误,记录驼鹿级别的跟踪是没有用的。谢谢你指出这一点。尽管Bar.pm无法按照您的帖子预期工作,但至少一个直接呼叫应该会给出所需的行为。