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


2754

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

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

इसलिए, दो अलग-अलग अपवादों को पकड़ने की मेरी कोशिश बिल्कुल नहीं है।

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


6
ध्यान दें कि पायथन 3 में, बाद वाला अब मान्य सिंटैक्स नहीं है।
गेरिट

जवाबों:


3721

से अजगर प्रलेखन :

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

except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

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

except (IDontLikeYouException, YouAreBeingMeanException), e:
    pass

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


9
मैंने यह कोशिश की ... एक के साथ list, और यह एक परिणाम के रूप में TypeErrortupleअपेक्षा के अनुरूप कार्य करने के लिए त्रुटियां दिखती हैं।
बॉलपॉइंटबैन

4
जब आप स्पष्ट रूप से देखते हैं कि आपने एक सूची का उपयोग क्यों किया है तो यह दस्तावेज है कि इस मामले में एक टपल की आवश्यकता है?
यांत्रिक_मीट

6
यह स्पष्ट नहीं था कि क्या "कोष्ठक रूपी टपल" महज वाक्य-विन्यास था या कि एक ठोस टपल की आवश्यकता थी। "कोष्ठककृत" भ्रामक है क्योंकि आप कहीं और कोष्ठक के बिना एक टपल बना सकते हैं और फिर इसका उपयोग exceptलाइन में कर सकते हैं। यदि exceptलाइन में बनाया गया है, तो यह केवल आवश्यक है ।
बॉलपॉइंटबैन

5
@JosephBani, जनरेटर के भावों के बारे में क्या?
जैमरइंटरप्रोग्रामर

12
@JosephBani यह बिल्कुल सच नहीं है। में 2 + (x * 2), (x * 2)निश्चित रूप से एक टपल नहीं है। कोष्ठक एक सामान्य समूह निर्माण है। टपल की ख़ासियत यह है कि इसमें एक अल्पविराम होता है - पाइथन दस्तावेज़ीकरण देखें : "ध्यान दें कि यह वास्तव में अल्पविराम है जो एक टपल बनाता है, कोष्ठक नहीं।"
सोरेन ब्योर्नस्टैड

314

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

यह करो:

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

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

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

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

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

import sys

try:
    mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
    sys.exit(0)

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

यह यहाँ प्रलेखित है: https://docs.python.org/tutorial/errors.html

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

import sys

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

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

पदावनत

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

import sys

try:
    mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
    print err
    print err.args
    sys.exit(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


2
का अच्छा इसके अलावा suppress, एक बहुत सिर्फ कर की तुलना में अधिक पठनीय passपरexcept
लुगदी

50

से अजगर प्रलेखन -> 8.3 अपवाद हैंडलिंग :

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

except (RuntimeError, TypeError, NameError):
    pass

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


35

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

#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. यदि आप किसी वैश्विक वैरिएबल को सहन नहीं कर सकते हैं, तो इसे मुख्य () में परिभाषित करें और जहां जरूरत हो, वहां इसे पास करें ...


17

ऐसा करने का एक तरीका है ..

try:
   You do your operations here;
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   If there is any exception from the given exception list, 
   then execute this block.
   ......................
else:
   If there is no exception then execute this block. 

और दूसरा तरीका विधि बनाना है जो exceptब्लॉक द्वारा निष्पादित कार्य करता है और इसे उस सभी exceptब्लॉक के माध्यम से कॉल करता है जिसे आप लिखते हैं ..

try:
   You do your operations here;
   ......................
except Exception1:
    functionname(parameterList)
except Exception2:
    functionname(parameterList)
except Exception3:
    functionname(parameterList)
else:
   If there is no exception then execute this block. 

def functionname( parameters ):
   //your task..
   return [expression]

मुझे पता है कि दूसरा ऐसा करने का सबसे अच्छा तरीका नहीं है, लेकिन मैं सिर्फ इस बात को करने के लिए कई तरीके दिखा रहा हूं।


मैं दूसरे का उपयोग कर रहा हूं क्योंकि मेरे पास दो अलग-अलग अपवाद हैं जिन्हें प्रत्येक को अलग-अलग संसाधित करने की आवश्यकता है। क्या ऐसा करने में कुछ गड़बड़ है?
मैजिकमैन

@ माजिकमैन प्रत्येक फ़ंक्शन को एक ही फ़ंक्शन को कॉल करने वाले एकाधिक क्लॉज़ के साथ दूसरा तरीका सबसे अच्छा नहीं है जब आप स्वयं को दोहराने की कोशिश नहीं कर रहे हैं और दो अपवादों के लिए एक ही काम कर रहे हैं। (ऐसा करने के सही तरीके के लिए अन्य उत्तर देखें)। हालाँकि, exceptजब आप अपवादों को अलग तरीके से हैंडल करना चाहते हैं , तो कई क्लॉज़ होना सामान्य है।
नामस्रोत
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.