7

私は最近、Mooseとその優れたOOフレームワークを使い始めたばかりでなく、新しいOOの概念を学ぶこともできました。私がやりたかったことの1つは、オブジェクトの作成中に呼び出し元の観点からエラー報告を行うことでした。Mooseには、croak呼び出しによるデフォルトのエラー報告をオーバーライドするようにMooseに指示するモジュールMoose :: Error::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;

ムースコード-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が使用されていない場合、これは実際のスタックトレースよりも簡潔です。ただし、発信者の観点からは報告しません。これがPerl5OOコードであり、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が実行された場合、エラーが発生します。

「ERR:fooser.plの6行目にattr1を提供しませんでした」

これは、発信者の観点から、行番号を指しているためです。MOP.pmの行番号ではなくfooser.plの6。364。

Mooseでこれを行うにはどうすればよいですか?それとも私はここで何かを誤解していますか?

4

1 に答える 1

4

1 つのオプションは、MooseX::Constructor::AllErrorsを使用することです。

このモジュールは、コンストラクターのエラーを収集し、それらをまとめて出力します (デフォルトの動作は、最初のエラーが発生するとすぐに終了します)。呼び出し元の観点から見ると、印刷の副作用があります。

に置き換えるuse metaclassuse 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

...完全な解決策ではありません。

于 2010-05-02T18:48:43.783 に答える