2011-11-28 20 views
17

"उचित" अपवाद वर्ग क्या है जब मेरे कार्यों में से एक None का पता लगाता है जहां तर्क मान आवश्यक है? उदाहरण के लिए:कोई भी तर्क उठाने के लिए उचित अपवाद नहीं है यदि कोई भी तर्क

def MyFunction(MyArg1, MyArg2): 

    if not MyArg2: 
      raise ?Error? 

मुझे लगता है कि मैंने देखा है TypeError यहां इस्तेमाल किया है (और यह सच है कि मैं एक NoneType जहां कुछ अन्य प्रकार की उम्मीद है प्राप्त कर रहा हूँ है), लेकिन है कि मुझे इस स्थिति के लिए के रूप में बहुत सही हड़ताल नहीं करता है जहां मुझे लगता है कि अपवाद अधिक स्पष्ट हो सकता है।

assert type(MyArg2) == int 

या वैकल्पिक रूप से:

+0

आपको इस तरह की बहस की जांच नहीं करनी चाहिए। किसी भी अपवाद के साथ असफल होने के साथ बस इसे और असफल होने दें। (और यदि आपको वास्तव में * यह करना चाहिए, तो 'TypeError' सही अपवाद है। इसे अधिक विशिष्ट बनाने के लिए एक स्पष्टीकरण स्ट्रिंग जोड़ें।) –

+0

मैं शायद' TypeError' उठाऊंगा, अंतर्निहित पायथन अपवादों पर एक नज़र डालें प्रलेखन: http://docs.python.org/library/exceptions.html –

+0

@ स्वेन: जैसा कि आप सुझाव देते हैं, मैं आम तौर पर करता हूं, लेकिन यह एक विशेष मामला है जिसमें मैं यह जांच करना चाहता हूं। –

उत्तर

29

कोई "अवैध तर्क" या "शून्य सूचक" पायथन में अंतर्निहित अपवाद नहीं है। इसके बजाए, अधिकांश फ़ंक्शन TypeError (अमान्य प्रकार जैसे NoneType) या ValueError (सही प्रकार, लेकिन मान स्वीकृत डोमेन के बाहर है) बढ़ाएं।

यदि आपके फ़ंक्शन को किसी विशेष वर्ग की ऑब्जेक्ट की आवश्यकता होती है और इसके बजाय None प्राप्त होती है, तो संभवतः इसे TypeError बढ़ाया जाना चाहिए जैसा आपने बताया था। इस मामले में, आप स्पष्ट रूप से None लिए जाँच करनी चाहिए, हालांकि, के बाद से सही प्रकार का ऑब्जेक्ट False बूलियन अगर यह __nonzero__/__bool__ लागू करता है का मूल्यांकन हो सकता है:

if MyArg2 is None: 
    raise TypeError 

अजगर डॉक्स:

-1

बस ज़ोर का उपयोग

assert type(MyArg2) != None 

यह आपको गलत प्रकार से गुजर रहा है, साथ ही कोई भी समस्या हल करने से किसी को रोकने जाएगा। यह एक AssertionError वापस आ जाएगी, as per the docs.

+1

यह पाइथन की बतख-टाइपिंग भावना के विपरीत है। यह कोड की प्रयोज्यता पर अनावश्यक प्रतिबंध लगाता है। (मेरा डाउनवोट नहीं, बीटीडब्ल्यू) –

+1

@ स्वेनमार्कक हम्म, मैंने इसे सफलतापूर्वक * बतख टाइपिंग के कारण * उपयोग किया है।अर्थात्, बतख टाइपिंग छुपा हुआ है * क्यों * कुछ असफल रहा है। यदि आपको खुद को यह कहने की आवश्यकता है और ऐसा शुरू होने से पहले ऐसा होना चाहिए, तो जोर देना ऐसा करने का एक सुविधाजनक तरीका है। उदाहरण के लिए, इनपुट चर पर लूप के साथ एक फ़ंक्शन लिखें। यह globbing के लिए फ़ाइल नामों की एक सूची माना जाता है। क्या होता है यदि एक आइटम के साथ सूची उत्तीर्ण करने के बजाय, आप ग्लोब वर्णों के साथ एक स्ट्रिंग पास करते हैं? –

+1

जोर से समस्या यह है कि यह उन मानों को अनदेखा करता है जो पूरी तरह से अच्छी तरह से सेवा कर सकते हैं (इस उदाहरण में) लंबे पूर्णांक, फ्लोट्स (कई परिस्थितियों में, उदाहरण के लिए 'रेंज() '), और किसी ऑब्जेक्ट जो' __int__ लागू करता है)() 'विशेष विधि। एक बेहतर दृष्टिकोण, अगर आपको लगता है कि आपको इस तरह की चीज की ज़रूरत है, तो शायद विधि में जल्दी पूर्णांक को पूर्ण करने के लिए तर्क को मजबूर करने का प्रयास करें, उदा। 'MyArg2 = int (MyArg2)'। – kindall

2

अजगर समारोह के अधिकांश को जन्म देती है TypeError अगर None एक तर्क के रूप पारित कर दिया है। किसी भी समारोह को chr(None) कहें और देखें कि यह TypeError उठाता है।

2

जैसा कि अन्य ने उल्लेख किया है, TypeError या ValueError प्राकृतिक होगा। यदि यह पर्याप्त विशिष्ट प्रतीत नहीं होता है, तो आप दो अपवादों में से कोई भी बेहतर फिट बैठ सकते हैं। यह कार्यों के एक विस्तृत वर्ग के लिए अमान्य तर्कों के निरंतर संचालन की अनुमति देता है जबकि आपको विशेष कार्य के लिए अधिक जानकारी भी देता है।

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