BUILD
메서드가 실패하면 클래스를 폭파 시키길 원합니다. 그러나 croak
을 사용하여 오류를 처리하면 오류는 발신자의 코드가 아닌 Class/MOP/Method.pm에서보고됩니다. (즉, 개체를 인스턴스화하는 호출자입니다.) IOW, croak
은 호출 트리를 충분히 멀리 짖지 않습니다.무스 BUILD 메서드에서 울기
보라 :
package Test;
use Moose;
use Carp 'croak';
sub BUILD {
croak 'u r dum';
}
1;
가에 Test
결과를 인스턴스화 : lib에는 집/friedo/perl5가//에
UR 둠/perl5의/x86_64에-리눅스 GNU 스레드 멀티/클래스/MOP/Method.pm 라인 (125)
Carp.pm
은 할 패키지를 알고 @CARP_NOT
라는 패키지 변수에주의를 지불하도록되어 피하십시오. 그러나 목록의 한 항목에만주의를 기울이는 것으로 보입니다. 예를 들어, 내 Test.pm
이를 추가하는 경우 :
our @CARP_NOT = ('Class::MOP::Method');
그런 다음 결과는 다음과 같습니다
/perl5의/x86_64에-리눅스 GNU 스레드 멀티 lib 디렉토리 홈/friedo/perl5가//에서 UR 둠 /Mose/Object.pm 줄 59
그래서 을 배열에도 추가해야합니다. 맞습니까?
our @CARP_NOT = ('Class::MOP::Method', 'Moose::Object' );
유는 59
무스 :: Object가 영향을받지 않는 것으로 보인다 /home/friedo/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/Moose/Object.pm 라인에 둠 r에.
나는 잠시 동안 내 머리를 쾅쾅 대고 있었고, 무엇이 엉망인지 알아낼 수 없었다.
감사합니다.
아, 그런 생각조차하지 않았습니다. 클래스를 완성한 후에는 항상 make_immutable을 사용합니다. – friedo
@friedo, 현재 실행 중에 * 더 이상 클래스를 변경하지 않기로 약속함으로써 Moose는 클래스에 효율적인 생성자를 만듭니다. 그것은 당신이 모듈을 바꾸는 것을 방해하지 않습니다. – ikegami
알아요 - 제가 다 끝나면 그것을 추가하는 것을 기억하는 대신 내 패키지 보일러 플레이트에 추가해야합니다. – friedo