2012-11-23 19 views
29

मैं किसी विशिष्ट ValueError को पकड़ना चाहता हूं, न केवल किसी भी ValueError।
मैं इस तरह somthing की कोशिश की:पायथन: विशिष्ट अपवाद को पकड़ना

try: maquina['WPF'] = macdat(ibus, id, 'WPF') 
except: ValueError, 'For STRING = ’WPF’, this machine is not a wind machine.': 
    pass 

लेकिन यह एक सिंटैक्स त्रुटि को जन्म देती है: शाब्दिक को नहीं सौंप सकते।
तो मैं करने की कोशिश की:

try: maquina['WPF'] = macdat(ibus, id, 'WPF') 
except ValueError, e: 
    if e != 'For STRING = ’WPF’, this machine is not a wind machine.': 
     raise ValueError, e 

लेकिन यह अपवाद को जन्म देती है, भले ही वह एक मैं बचना चाहते है।

+7

आप नीचे दिए गए अपने जवाब मिल गया है, लेकिन अपवाद है जब आप फिर से उठाना सिर्फ 'अपने आप ही raise' का उपयोग करें: शुरू होता है कि जहां यह था कि जिस तरह से करता है, तो अपवाद नहीं संभाला है आप अभी भी एक के बजाय मूल आईएसपी नामों को प्राप्त फिर से उठाया। – Duncan

उत्तर

37

except ValueError,e, e अपवाद का एक उदाहरण है, स्ट्रिंग नहीं। तो जब आप परीक्षण करते हैं कि e किसी विशेष स्ट्रिंग के बराबर नहीं है, तो वह परीक्षण हमेशा गलत होता है। आज़माएं:

if str(e) != "..." 

इसके बजाए।

उदाहरण:

def catch(msg): 
    try: 
     raise ValueError(msg) 
    except ValueError as e: # as e syntax added in ~python2.5 
     if str(e) != "foo": 
      raise 
     else: 
      print("caught!") 

catch("foo") 
catch("bar") 

आमतौर पर, आप नहीं वास्तव में त्रुटि संदेश पर भरोसा करने की अगर आप इसे मदद कर सकते हैं चाहते हैं - यह थोड़ा बहुत नाजुक है।

class MyValueError(ValueError): pass 

तो फिर तुम केवल MyValueError पकड़ने और अन्य ValueError रों अपने रास्ते पर जारी रख सकते हैं: आप प्रतिदेय macdat पर नियंत्रण है, बजाय macdat में एक ValueError जुटाने की हैं, तो आप जो ValueError से विरासत एक कस्टम अपवाद बढ़ा सकता है कुछ और (या नहीं) द्वारा पकड़ा जा सकता है। सरल except ValueError अभी भी इस प्रकार के अपवाद को पकड़ लेगा, इसलिए इसे अन्य कोड में भी व्यवहार करना चाहिए जो इस फ़ंक्शन से ValueErrors को भी पकड़ सकता है।

+0

यह वही है जो मैं चाहता हूं। आपकी मदद और सुझावों के लिए धन्यवाद। –

+1

'Exception.message' विशेषता पायथन 3 में चली गई है, क्या आप अपना जवाब उस प्रतिबिंबित करने के लिए अपडेट कर सकते हैं और एक विकल्प सुझा सकते हैं (उदाहरण के लिए,' str (e) ')? यह सवाल – vaultah

+1

@vaultah के लिए एक अच्छा कैनोलिक डुप्लिकेट है - इसके लिए धन्यवाद। मैंने अपडेट किया है – mgilson

3

अंतिम के लिए विधि सही है (लेकिन प्रिंट रिप्र (ई) यह देखने के लिए कि यह क्यों काम नहीं करता है)।

हालांकि, अगर आप अपवाद जानकारी सही होना चाहता हूँ, आपको कोई नया अपवाद उठाना चाहिए नहीं (अब आप करते हैं), लेकिन एक ही एक बढ़ा। अन्यथा इसे पकड़ने वाला अधिक कोड, या यदि यह पकड़ा नहीं गया है तो त्रुटि संदेश, स्रोत के रूप में आपका कोड दिखाएगा, जबकि यह मूल स्रोत होना चाहिए।

एक तर्क के बिना इस, उपयोग बढ़ाने ऐसा करने के लिए (के भीतर ब्लॉक को छोड़कर, ज़ाहिर है, अन्यथा कोई "वर्तमान" अपवाद नहीं है)।

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