2010-05-02 3 views
7

के परिप्रेक्ष्य से क्रोक त्रुटि रिपोर्टिंग नहीं, मैंने हाल ही में मूस और इसके महान ओओ ढांचे पर न केवल उपयोग करने के लिए बल्कि नई ओओ अवधारणाओं को सीखने के लिए भी शुरू किया। उन चीजों में से एक जो मैं करना चाहता था, ऑब्जेक्ट सृजन के दौरान कॉलर के परिप्रेक्ष्य से त्रुटि रिपोर्टिंग करना था। मैंने देखा कि मूस में मॉड्यूल मूस है :: त्रुटि :: क्रोक जो मूस को क्रोक कॉल द्वारा डिफ़ॉल्ट त्रुटि रिपोर्टिंग को ओवरराइड करने के लिए कहता है। मैं इसे इस्तेमाल किया है, लेकिन यह मदद करने के लिए नहीं मालूम थामूस :: त्रुटि :: कॉलर

मूस कोड - 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

पर वास्तविक स्टैक ट्रेस से अधिक है जो मूस :: त्रुटि :: क्रोक का उपयोग नहीं किया जाता है। लेकिन यह कॉलर के परिप्रेक्ष्य से इसकी रिपोर्ट नहीं करता है। यदि यह एक पर्ल 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 लाइन 6 "

जो कॉलर के परिप्रेक्ष्य से है क्योंकि यह लाइन संख्या को इंगित करता है। MOP.pm की लाइन संख्या के बजाय fooser.pl में से 6। 364.

मैं इसे मूस में कैसे कर सकता हूं? या मैं यहाँ कुछ गलत समझ रहा हूँ?

+0

क्रोक के बजाय कबूल का उपयोग करें। डिफ़ॉल्ट कौन सा है। – jrockway

+1

डिफ़ॉल्ट मदद नहीं करता है। यह कॉलर होने वाली अंतिम प्रविष्टि के साथ एक संपूर्ण निशान देता है। जब मैं त्रुटियों को लॉगिंग कर रहा हूं, तो मेरी कॉल में त्रुटि होने पर मूस स्तर के निशान लॉग करना उपयोगी नहीं है। –

उत्तर

4

एक विकल्प MooseX::Constructor::AllErrors का उपयोग करना है।

यह मॉड्यूल कन्स्ट्रक्टर त्रुटियों को एकत्र करता है और उन्हें सभी को एक साथ प्रिंट करता है (जैसे ही पहली त्रुटि का सामना करना पड़ता है) डिफ़ॉल्ट व्यवहार मर जाता है)। यह कॉलर के परिप्रेक्ष्य से प्रिंटिंग का दुष्प्रभाव है।

अपने use MooseX::Constructor::AllErrors; साथ use metaclass बदलें और त्रुटि हो जाता है:

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

हालांकि, अगर आप एक और मॉड्यूल (जैसे बार) के अंदर से Foo->new फोन करके अपनी स्क्रिप्ट में Bar->new फोन, त्रुटि अधिक की तरह होगा:

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

... तो यह एक पूर्ण समाधान नहीं है।

+0

rjh बाहर इंगित करने के लिए धन्यवाद। हालांकि, Bar.pm आपकी पोस्ट के अनुसार इच्छित नहीं है, कम से कम एक प्रत्यक्ष कॉल वांछित व्यवहार देना चाहिए। –