2010-02-01 8 views
20

क्या कस्टम टेक्स्ट के साथ built-in exception उठाना ठीक है? या कस्टम टेक्स्ट के साथ built-in warning भी बढ़ाने के लिए?क्या अंतर्निहित अपवाद उठाना ठीक है, लेकिन एक अलग संदेश के साथ, पायथन में?

प्रलेखन पढ़ता है:

exception ValueError: Raised when a built-in operation or function receives an argument (…)

यह निहित है कि केवल निर्मित संचालन एक ValueError अपवाद उठाना चाहिए?

प्रैक्टिस में, मैं समझता हूं कि यह एक अपवाद वर्ग बनाना सुरक्षित है जो ValueError या Exception से प्राप्त होता है। लेकिन क्या यह ठीक नहीं है, और सीधे ValueError ("कस्टम टेक्स्ट") बढ़ाएं?

चूंकि ValueError अंतर्निहित है, इसलिए एक वैल्यूएरर (एक कस्टम टेक्स्ट के साथ) को बढ़ाने से उपयोगकर्ताओं को जल्दी से यह देखने की अनुमति मिलती है कि कस्टम अपवाद प्रकार ("ValueErrorSpecificModule" जैसे मानक, मानक नहीं है) ।

+2

सुनिश्चित करें कि आप अपवाद पदानुक्रम का सम्मान करते हैं। यह असंभव है, यदि आप 'टाइपरर'' जैसे मानक अपवाद पर विचार कर रहे हैं, तो 'अपवाद' उप-वर्गीकरण कभी भी एक अच्छा विकल्प होगा। 'StandardError' subclassing शायद ... 'आयात अपवाद ई के रूप में; मदद (ई) 'पेड़ दिखाता है। –

उत्तर

21

की तरह कुछ कर रही के साथ प्रचालन गलत कुछ भी नहीं है के लिए दस्तावेज़ डाला है हो सकता है:

raise ValueError("invalid input encoding") 

वास्तव में, मैं करता हूँ कि अक्सर जब मैं मैं कुछ कोड के पहले पास लिख रहा हूँ। इस तरह से करने में मुख्य समस्या यह है कि आपके कोड के क्लाइंटों को उनके अपवाद हैंडलिंग में सटीक समय लगता है; उस विशिष्ट अपवाद को पकड़ने के लिए, उन्हें पकड़े गए अपवाद ऑब्जेक्ट पर स्ट्रिंग मिलान करना होगा, जो स्पष्ट रूप से नाजुक और थकाऊ है। इस प्रकार, अपने आप के ValueError सबक्लास पेश करना बेहतर होगा; यह अभी भी ValueError के रूप में पकड़ा जा सकता है, लेकिन अधिक विशिष्ट अपवाद वर्ग के रूप में भी।

raise ValueError('some problem: %s' % value) 

आप शायद यह कुछ इस तरह से बदलना होगा:

अंगूठे का एक सामान्य नियम है कि जब भी आप कोड की तरह है

class SomeProblem(ValueError): 
    """ 
    Raised to signal a problem with the specified value. 
    """ 
# ... 
raise SomeProblem(value) 

आप हो सकता है का कहना है कि अपवाद प्रकार निर्दिष्ट क्या गलत हो गया, जबकि संदेश/विशेषताएँ निर्दिष्ट करें यह गलत हो गया।

2

यह बिल्कुल ठीक है।

मदद करने के लिए निर्मित अपवाद

उदाहरण के लिए अगर आप कुछ है कि एक dict की तरह काम करता है, तो आप हमेशा की तरह कारणों के लिए एक KeyError बढ़ा सकते हैं से अलग अपनी खुद की उपवर्ग बनाना चाह सकते हैं हालांकि, लेकिन क्या हुआ अगर KeyError वास्तव में कार्यान्वयन में उपयोग कर रहे एक अंतर्निहित dict से आ रहा है।

KeyError का एक उपवर्ग स्थापना यह देखना आसान वहाँ कार्यान्वयन में एक बग है, और नहीं है कि कुंजी सिर्फ अपने वस्तु

4

यह ठीक है और मैं यह सब समय में नहीं है कि बनाता है। मुझे कई परिस्थितियों में MySpecialTypeError की तुलना में TypeError देखने में आश्चर्य की बात नहीं है।

page you linked पर, मैं वाक्यांश "निर्मित" दिखाई नहीं देता:

exception TypeError: Raised when an operation or function is applied to an object of inappropriate type. The associated value is a string giving details about the type mismatch. 

शायद किसी को अपने प्रश्न को देखा और पहले से ही प्रलेखन तय की।
संपादित करें: ऐसा लगता है कि आप ValueError बजाय TypeError

+0

अच्छी पकड़। धन्यवाद! – EOL

संबंधित मुद्दे