python एक पंक्ति में कई अपवादों को पकड़ें(ब्लॉक को छोड़कर)




exception exception-handling (6)

पायथन 2.7 दस्तावेज़ीकरण बताता है कि:

विभिन्न अपवादों के लिए हैंडलर निर्दिष्ट करने के लिए, एक प्रयास कथन में क्लॉज को छोड़कर एक से अधिक हो सकते हैं। ज्यादातर एक हैंडलर पर निष्पादित किया जाएगा। हैंडलर केवल उन प्रयासों को संभालते हैं जो समान प्रयास खंड में होते हैं, न कि एक ही प्रयास कथन के अन्य हैंडलर में। एक छोड़कर खंड को एकाधिक अपवादों को एक संश्लेषित tuple के रूप में नामित किया जा सकता है, उदाहरण के लिए:

try:
    raise ValueError("hello")
except (RuntimeError, ValueError, KeyError) as a:
    print a

ध्यान दें कि इस tuple के चारों ओर कोष्ठक की आवश्यकता है, क्योंकि ValueError को छोड़कर, ई: सामान्य पायथन (नीचे वर्णित) में ई-ए के रूप में ValueError को छोड़कर सामान्य रूप से लिखा गया सिंटैक्स था। पुराना वाक्यविन्यास अभी भी पीछे की संगतता के लिए समर्थित है। इसका मतलब है RuntimeError को छोड़कर, TypeError को छोड़कर बराबर नहीं है (रनटाइमर, टाइप एरर): लेकिन टाइपटाइर के रूप में रनटाइम एरर को छोड़कर: जो आप नहीं चाहते हैं।

मुझे पता है कि मैं कर सकता हूं:

try:
    # do something that may fail
except:
    # do this if ANYTHING goes wrong

मैं यह भी कर सकता हूं:

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreTooShortException:
    # stand on a ladder

लेकिन अगर मैं दो अलग-अलग अपवादों के अंदर एक ही काम करना चाहता हूं, तो अभी मैं सबसे अच्छा सोच सकता हूं:

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreBeingMeanException:
    # say please

क्या कोई तरीका है कि मैं ऐसा कुछ कर सकता हूं (क्योंकि दोनों अपवादों में लेने की कार्रवाई say please ):

try:
    # do something that may fail
except IDontLikeYouException, YouAreBeingMeanException:
    # say please

अब यह वास्तव में काम नहीं करेगा, क्योंकि यह वाक्यविन्यास से मेल खाता है:

try:
    # do something that may fail
except Exception, e:
    # say please

तो, दो अलग अपवादों को पकड़ने के मेरे प्रयास वास्तव में नहीं आते हैं।

क्या इसे करने का कोई तरीका है?


मैं एक पंक्ति में कई अपवाद कैसे प्राप्त करूं (ब्लॉक को छोड़कर)

यह करो:

try:
    may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
    handle(error) # might log or have some other default behavior...

पुरानी वाक्यविन्यास के कारण ब्रांड्स की आवश्यकता होती है जो कि किसी ऑब्जेक्ट को त्रुटि ऑब्जेक्ट को असाइन करने के लिए अल्पविराम का उपयोग करती है। असाइनमेंट के लिए कीवर्ड का उपयोग किया जाता है। आप त्रुटि ऑब्जेक्ट के लिए किसी भी नाम का उपयोग कर सकते हैं, मैं व्यक्तिगत रूप से error पसंद करता हूं।

सर्वश्रेष्ठ प्रणालियां

वर्तमान में और पाइथन के साथ संगत तरीके से ऐसा करने के लिए, आपको अपवादों को अल्पविरामों से अलग करने की आवश्यकता है और उन्हें पहले वाक्यविन्यास से अलग करने के लिए कोष्ठक के साथ लपेटने की आवश्यकता है, जो अपवाद उदाहरण को अपरिपक्व प्रकार को एक अपरिपक्व प्रकार के साथ पकड़ा जा सकता है अल्पविराम।

सरल उपयोग का एक उदाहरण यहां दिया गया है:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
    quit(0)

मैं छिपाने वाली बग से बचने के लिए केवल इन अपवादों को निर्दिष्ट कर रहा हूं, जो मुझे लगता है कि मैं पूरी स्टैक ट्रेस से अपेक्षा करता हूं।

यह यहां दस्तावेज है: https://docs.python.org/tutorial/errors.html

आप एक चर के लिए अपवाद असाइन कर सकते हैं, ( e आम है, लेकिन यदि आप लंबे अपवाद हैंडलिंग करते हैं या आपका आईडीई केवल उस से बड़े चयन को हाइलाइट करता है, जैसा कि मेरा करता है।) उदाहरण में एक तर्क विशेषता है। यहाँ एक उदाहरण है:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError) as err: 
    print(err)
    print(err.args)
    quit(0)

ध्यान दें कि पायथन 3 में, जब ब्लॉक को except ब्लॉक समाप्त होता है तो err ऑब्जेक्ट गुंजाइश से बाहर हो जाता है।

पदावनत

आप कोड देख सकते हैं जो त्रुटि को अल्पविराम से असाइन करता है। यह उपयोग, पायथन 2.5 और इससे पहले का एकमात्र फॉर्म बहिष्कृत है, और यदि आप चाहते हैं कि आपका कोड पाइथन 3 में संगत हो, तो आपको नए फॉर्म का उपयोग करने के लिए वाक्यविन्यास अपडेट करना चाहिए:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
    print err
    print err.args
    quit(0)

यदि आप अपने कोडबेस में अल्पविराम नाम असाइनमेंट देखते हैं, और आप पाइथन 2.5 या उच्चतर का उपयोग कर रहे हैं, तो इसे करने के नए तरीके पर स्विच करें ताकि अपग्रेड करते समय आपका कोड संगत रहे।

suppress संदर्भ प्रबंधक

स्वीकृत उत्तर वास्तव में कोड की 4 पंक्तियां हैं, न्यूनतम:

try:
    do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

try , except , pass लाइनों को पाइथन 3.4 में उपलब्ध दबाने वाले संदर्भ प्रबंधक के साथ एक पंक्ति में संभाला जा सकता है:

from contextlib import suppress

with suppress(IDontLikeYouException, YouAreBeingMeanException):
     do_something()

तो जब आप कुछ अपवादों को pass करना चाहते हैं, तो suppress उपयोग करें।


यदि आप अक्सर बड़ी संख्या में अपवादों का उपयोग करते हैं, तो आप एक ट्यूपल को पूर्व-परिभाषित कर सकते हैं, इसलिए आपको उन्हें कई बार फिर से टाइप करने की आवश्यकता नहीं है।

#This example code is a technique I use in a library that connects with websites to gather data

ConnectErrs  = (URLError, SSLError, SocketTimeoutError, BadStatusLine, ConnectionResetError)

def connect(url, data):
    #do connection and return some data
    return(received_data)

def some_function(var_a, var_b, ...):
    try: o = connect(url, data)
    except ConnectErrs as e:
        #do the recovery stuff
    blah #do normal stuff you would do if no exception occurred

टिप्पणियाँ:

  1. यदि आपको भी पूर्व परिभाषित टुपल की तुलना में अन्य अपवादों को पकड़ने की आवश्यकता है, तो आपको ब्लॉक को छोड़कर दूसरे को परिभाषित करने की आवश्यकता होगी।

  2. यदि आप केवल वैश्विक चर को बर्दाश्त नहीं कर सकते हैं, इसे मुख्य () में परिभाषित करें और जहां आवश्यक हो वहां इसे पास करें ...


पाइथन 2.5 और पुराने संस्करणों के लिए, सही वाक्यविन्यास है:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    print e

जहां e अपवाद उदाहरण है।


पायथन से दस्तावेज़ीकरण :

एक छोड़कर खंड उदाहरण के लिए, एक कोष्ठक टुपल के रूप में कई अपवादों का नाम दे सकता है

except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

या, केवल पायथन 2 के लिए:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    pass

एक अल्पविराम के साथ चर से अपवाद को अलग करना अभी भी पायथन 2.6 और 2.7 में काम करेगा, लेकिन अब इसे हटा दिया गया है और पायथन 3 में काम नहीं करता है; अब आप के as उपयोग as जाना चाहिए।


पायथन दस्तावेज़ से -> 8.3 हैंडलिंग अपवाद :

विभिन्न अपवादों के लिए हैंडलर निर्दिष्ट करने के लिए, एक try कथन में क्लॉज को छोड़कर एक से अधिक हो सकते हैं। ज्यादातर एक हैंडलर पर निष्पादित किया जाएगा। हैंडलर केवल उन प्रयासों को संभालते हैं जो समान प्रयास खंड में होते हैं, न कि एक ही प्रयास कथन के अन्य हैंडलर में। एक छोड़कर खंड को एकाधिक अपवादों को एक संश्लेषित tuple के रूप में नामित किया जा सकता है, उदाहरण के लिए:

except (RuntimeError, TypeError, NameError):
    pass

ध्यान दें कि इस tuple के चारों ओर कोष्ठक की आवश्यकता है, क्योंकि ValueError, e: को छोड़कर ValueError, e: सामान्य पायथन (नीचे वर्णित) में except ValueError as e: सामान्य रूप से लिखा गया सिंटैक्स था। पुराना वाक्यविन्यास अभी भी पीछे की संगतता के लिए समर्थित है। इसका मतलब है except RuntimeError, TypeError को except (RuntimeError, TypeError): बराबर नहीं है except (RuntimeError, TypeError): लेकिन except RuntimeError as TypeError: except RuntimeError as को except RuntimeError as TypeError: जो आप नहीं चाहते हैं।





exception-handling