2010-05-02 4 views
7

저는 방금 Moose와 그 훌륭한 OO 프레임 워크를 사용하기 시작할뿐만 아니라 새로운 OO 개념을 배우기 시작했습니다. 내가하고 싶은 일 중 하나는 객체 생성 중에 호출자의 관점에서 오류보고를하는 것입니다. 나는 Moose가 moose :: Error :: Croak 모듈을 가지고있는 것을 보았다. 이것은 Moose가 croak 호출에 의한 디폴트 에러보고를 무시하도록 알려준다. 나는 그것을 사용하지만, 도움을 보이지 않았다Moose :: Error :: 호출자의 관점에서보고하지 못하는 오류가 발생했습니다.

무스 코드 - 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가 사용되지 않는 경우 실제 스택 추적보다 간결합니다. 그러나 발신자의 관점에서보고하지는 않습니다. 이 펄 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이 실행 된 경우 나 오류를 가지고 것 :

"ERR : fooser에서 ATTR1를 제공하지 않았다 .pl line 6 "

발신자의 관점에서 볼 때, 회선 번호를 가리 킵니다. 6 of fooser.pl보다는 MOP.pm의 라인 번호. 364.

어떻게 이것을 무스에서 할 수 있습니까? 아니면 내가 여기서 뭔가를 오해하고있는 것입니까?

+0

고뇌 대신 고백을 사용하십시오. 어떤 것이 기본값입니다. – jrockway

+1

기본값은 도움이되지 않습니다. 호출자가되는 마지막 항목과 함께 전체 추적을 제공합니다. 오류를 로깅 할 때 오류가 호출되는 경우에는 무스 레벨 추적을 기록하는 것이 유용하지 않습니다. –

답변

4

하나의 옵션은 MooseX::Constructor::AllErrors을 사용하는 것입니다.

이 모듈은 생성자 오류를 수집하여 모두 인쇄합니다 (기본 오류는 첫 번째 오류가 발생하자마자 죽는 것입니다). 호출자의 관점에서 인쇄하는 부작용이 있습니다.

use metaclassuse MooseX::Constructor::AllErrors;로 교체하고 오류가된다 :

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

을하지만, 다른 모듈 (예를 들면 바) 내부에서 Foo->new를 호출 할 경우 스크립트에서 Bar->new를 호출, 오류가 더 같이 될 것이다 :

... 완벽한 해결책은 아닙니다.

+0

rjh를 지적 해 주셔서 감사합니다. Bar.pm은 게시물 당 의도 한대로 작동하지 않지만 적어도 직 접 호출은 원하는 동작을 제공해야합니다. –

관련 문제