2010-02-11 9 views
12

इस साधारण वर्ग पर विचार करें:मैं मूस से संरचित अपवाद कैसे प्राप्त कर सकता हूं?

package Foo; 
use Moose; 
has foo => (is => 'rw', isa => 'Int'); 

और फिर यह कोड:

use Try::Tiny; 
use Foo; 
my $f = try { 
    Foo->new(foo => 'Not an Int'); 
} 
catch { 
    warn $_; 
}; 

कोड विफल बाधाओं के बारे में एक अच्छा बड़ा त्रुटि संदेश के साथ मर जाता है।

मैं निकालने में सक्षम होना चाहता हूं कि कौन सा गुण विफल रहा (foo), क्या कारण था (असफल प्रकार की बाधा) और क्या मूल्य पारित किया गया था (Not an Int) जानकारी प्राप्त करने के लिए त्रुटि स्ट्रिंग को पार्स किए बिना।

कुछ ऐसा है:

catch { 
    if($_->isa('MooseX::Exception::TypeConstraint')) { 
     my $attrib = $_->attribute; 
     my $type = $_->type; 
     my $value = $_->bad_value; 

     warn "'$value' is an illegal value for '$attrib'. It should be a $type\n"; 
    } 
    else { 
     warn $_; 
    } 
}; 

क्या यह संभव है? क्या कोई मूसएक्स वितरण है जो ऐसा कर सकता है? बेहतर अभी तक, क्या कुछ मूस फीचर है जो मुझे याद आई है जिससे यह संभव हो जाएगा?

अद्यतन: मुझे विशेष रूप से प्रकार की बाधाओं में दिलचस्पी है, लेकिन अन्य मूस त्रुटियां भी बहुत अच्छी होंगी। मुझे यह भी पता है कि मैं die के साथ वस्तुओं को फेंक सकता हूं। तो, मैं लिखने वाले कोड में अपवादों को व्यवस्थित करना अपेक्षाकृत आसान है।

उत्तर

4

मैंने इसे स्वयं नहीं किया है, लेकिन मुझे लगता है कि MooseX::Error::Exception::Class जो हो सकता है वह हो सकता है।

+0

यह बहुत दिलचस्प है।यह MooseX :: थ्रोबल जैसा काम करता है लेकिन अपवाद :: कक्षा पर बनाया गया है और अपवाद वर्ग पदानुक्रम की शुरुआत को परिभाषित करता है। आंतरिक रूप से, यह निर्धारित करने के लिए त्रुटि संदेश का विश्लेषण करता है कि फेंकने के लिए किस प्रकार का अपवाद है। – daotoad

+0

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

3

MooseX::Throwable देखें, जो मेटाक्लास में error_class मान को प्रतिस्थापित करता है। कोड थोड़ा पुराना दिखता है हालांकि (मेट्रॉल्स अब त्रुटि वर्ग भूमिकाओं का समर्थन करता है), लेकिन वर्तमान विधि ऐसा लगता है कि यह अभी भी काम करेगा।

+0

यह वास्तव में आशाजनक लग रहा था, लेकिन इसमें केवल एक ही विशेषता है: स्टैक (स्टैक ट्रेस), पिछला_एक्सप्शन (यदि हमारे पास अपवादित अपवाद हैं), और संदेश ("विशेषता (foo) नहीं है ....") । अभी भी संदेश पार्सिंग अटक गया। – daotoad

+1

ऐ, मुझे संदेह है कि किसी को वास्तविक अपवाद वर्ग बनाना होगा और अब इसे बनाए गए कच्चे संदेशों के आस-पास एक वर्ग बनाने के बजाय त्रुटि (कोर कोड में) के मामलों में स्पष्ट रूप से निर्माण करना होगा। इन सभी का उपयोग करने के लिए इसे बदलने के लिए सभी कोर कोड से गुजरना काफी काम होगा, लेकिन मुझे यकीन है कि बहुत से लोग आपको धन्यवाद देंगे! – Ether

+0

ओह, मेरा स्वयंसेवक का मतलब नहीं था। :) मैं वास्तव में एक अच्छा आरटीएफएम जवाब पाने की उम्मीद कर रहा था। C'est ला vie। – daotoad

1

मेरे पास एक साल पहले एक ही सवाल था और #moose आईआरसी चैनल से पूछा गया था। जवाब यह था कि मूस वास्तव में संरचित अपवादों का समर्थन नहीं करता .... अभी तक।

एक सामान्य समझौता है कि यह मूस की कमी है जिसे तय किया जाना चाहिए, लेकिन हर जगह अपवादों को शुरू करने का कार्य कठिन है और अभी तक (afaik) नहीं किया गया है।

MooseX में दृष्टिकोण :: त्रुटि :: अपवाद :: कक्षा बहुत भंगुर है, क्योंकि यह मूस से संदेशों को पार्स करने पर आधारित है।

चूंकि आप वास्तव में मूस से विश्वसनीय संरचित अपवाद नहीं प्राप्त कर सकते हैं, इसलिए एक नया मान सेट करते समय अपनी प्रत्येक प्रकार की बाधाओं का परीक्षण करने के लिए आत्मनिरीक्षण का उपयोग करने पर विचार करें। कुछ बार यह एक व्यवहार्य दृष्टिकोण है।

बीटीडब्ल्यू: ध्यान दें कि a nasty bug in the way Moose handles composite constraints है।

+0

हाँच! यह एक हेकुवा बग है। अपवाद :: कक्षा दिलचस्प लगती है, ऐसा लगता है कि एक परियोजना में दो अलग-अलग ऑब्जेक्ट बिल्डिंग पुस्तकालयों का उपयोग करने के लिए ** गलत ** लगता है। थ्रोबल दिलचस्प है, लेकिन मुझे लगता है कि अपवाद उन स्थानों में से एक हैं जहां विरासत समझ में आता है। जो कुछ भी आप फेंकते हैं, उसे "थ्रोबल" करने के बजाय ** ** अपवाद होना चाहिए (जो भी इसका मतलब है ...)। मुझे 100% बेचा नहीं गया है कि विरासत * सही समाधान है। शायद उत्तर उपयुक्त गुणों के साथ एक अपवाद वर्ग है। मैं अभी तक आश्वस्त नहीं हूं। – daotoad

+0

उस बग को बंद कर दिया गया है, यह दिखाई देगा। –