python - पटन - सी++ प्रोग्राम
एक पंक्ति में कई अपवादों को पकड़ें(ब्लॉक को छोड़कर) (5)
मुझे पता है कि मैं कर सकता हूं:
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
उपयोग करें।
पायथन 2.7 दस्तावेज़ीकरण बताता है कि:
विभिन्न अपवादों के लिए हैंडलर निर्दिष्ट करने के लिए, एक प्रयास कथन में क्लॉज को छोड़कर एक से अधिक हो सकते हैं। ज्यादातर एक हैंडलर पर निष्पादित किया जाएगा। हैंडलर केवल उन प्रयासों को संभालते हैं जो समान प्रयास खंड में होते हैं, न कि एक ही प्रयास कथन के अन्य हैंडलर में। एक छोड़कर खंड को एकाधिक अपवादों को एक संश्लेषित tuple के रूप में नामित किया जा सकता है, उदाहरण के लिए:
try:
raise ValueError("hello")
except (RuntimeError, ValueError, KeyError) as a:
print a
ध्यान दें कि इस tuple के चारों ओर कोष्ठक की आवश्यकता है, क्योंकि ValueError को छोड़कर, ई: सामान्य पायथन (नीचे वर्णित) में ई-ए के रूप में ValueError को छोड़कर सामान्य रूप से लिखा गया सिंटैक्स था। पुराना वाक्यविन्यास अभी भी पीछे की संगतता के लिए समर्थित है। इसका मतलब है RuntimeError को छोड़कर, TypeError को छोड़कर बराबर नहीं है (रनटाइमर, टाइप एरर): लेकिन टाइपटाइर के रूप में रनटाइम एरर को छोड़कर: जो आप नहीं चाहते हैं।
पाइथन 2.5 और पुराने संस्करणों के लिए, सही वाक्यविन्यास है:
except (IDontLikeYouException, YouAreBeingMeanException), e:
print e
जहां e
अपवाद उदाहरण है।
यदि आप अक्सर बड़ी संख्या में अपवादों का उपयोग करते हैं, तो आप एक ट्यूपल को पूर्व-परिभाषित कर सकते हैं, इसलिए आपको उन्हें कई बार फिर से टाइप करने की आवश्यकता नहीं है।
#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
टिप्पणियाँ:
यदि आपको भी पूर्व परिभाषित टुपल की तुलना में अन्य अपवादों को पकड़ने की आवश्यकता है, तो आपको ब्लॉक को छोड़कर दूसरे को परिभाषित करने की आवश्यकता होगी।
यदि आप केवल वैश्विक चर को बर्दाश्त नहीं कर सकते हैं, इसे मुख्य () में परिभाषित करें और जहां आवश्यक हो वहां इसे पास करें ...
एक छोड़कर खंड उदाहरण के लिए, एक कोष्ठक टुपल के रूप में कई अपवादों का नाम दे सकता है
except (IDontLikeYouException, YouAreBeingMeanException) as e:
pass
या, केवल पायथन 2 के लिए:
except (IDontLikeYouException, YouAreBeingMeanException), e:
pass
एक अल्पविराम के साथ चर से अपवाद को अलग करना अभी भी पायथन 2.6 और 2.7 में काम करेगा, लेकिन अब इसे हटा दिया गया है और पायथन 3 में काम नहीं करता है; अब आप के as
उपयोग as
जाना चाहिए।