पायथन कोशिश ... कॉमा बनाम 'के रूप में छोड़कर' को छोड़कर


246

बयानों को छोड़कर ',' और 'as' में क्या अंतर है, जैसे:

try:
    pass
except Exception, exception:
    pass

तथा:

try:
    pass
except Exception as exception:
    pass

2.6 में दूसरा सिंटैक्स कानूनी है? यह विंडोज पर सीपीथॉन 2.6 में काम करता है लेकिन साइबरविन में 2.5 दुभाषिया शिकायत करता है कि यह अमान्य है।

यदि वे दोनों 2.6 में मान्य हैं जो मुझे उपयोग करना चाहिए?

जवाबों:


284

निश्चित दस्तावेज PEP-3110 है: कैचिंग अपवाद

सारांश:

  • पायथन 3.x में, चर के अपवाद को निर्दिष्ट करने के लिए उपयोग asकरना आवश्यक है।
  • पायथन 2.6+ में, asसिंटैक्स का उपयोग करें , क्योंकि यह बहुत कम अस्पष्ट है और पायथन 3.x के साथ संगत है।
  • पाइथन 2.5 और इससे पहले, कॉमा संस्करण का उपयोग करें, क्योंकि asयह समर्थित नहीं है।

16
का उपयोग करते हुए asएक ही रास्ता है अजगर 3.x. में एक स्थानीय करने के लिए अपवाद आवंटित करने के लिए लेकिन आवश्यकताas नहीं है , क्योंकि आपको इसे निर्दिष्ट करने की आवश्यकता नहीं है अगर आपको इसकी आवश्यकता नहीं है।
व्यापारी

38

हाँ, यह कानूनी है। मैं पायथन 2.6 चला रहा हूं

try:
    [] + 3
except Exception as x:
    print "woo hoo"

>>> 
woo hoo

अद्यतन : asसिंटैक्स का उपयोग करने का एक और कारण है । उपयोग करना ,चीजों को बहुत अधिक अस्पष्ट बनाता है, जैसा कि दूसरों ने बताया है; और यहाँ क्या फर्क पड़ता है। पाइथन 2.6 के रूप में, वहाँ है multicatchजो आपको एक exceptब्लॉक में कई अपवादों को पकड़ने की अनुमति देता है । ऐसी स्थिति में, यह कहने के लिए अधिक अभिव्यंजक और अजगर है

except (exception1, exception2) as e

कहने के बजाय

except (exception1, exception2), e

जो अभी भी काम करेगा


13
2.6 से पहले के पायथन संस्करणों ने आपको कई अपवाद प्रकारों को पकड़ने के लिए एक टपल का उपयोग करने की अनुमति दी। लेकिन वाक्यविन्यास भ्रमित था; आप except NameError, ValueError:तब उपयोग करेंगे कि आप ValueErrorयह नहीं सोच रहे थे कि अपवाद क्यों नहीं पकड़ा गया। या इस्तेमाल किया except (NameError, e):और एक साथ छोड़ दिया गया NameErrorके लिए 'e'!
मार्टिन पीटर्स

17

"के रूप में" वाक्यविन्यास पसंदीदा है जो आगे जा रहा है, हालांकि यदि आपके कोड को पुराने पायथन संस्करणों के साथ काम करने की आवश्यकता है (2.6 नए का समर्थन करने वाला पहला है) तो आपको कॉमा सिंटैक्स का उपयोग करने की आवश्यकता होगी।


9

यदि आप सभी अजगर संस्करणों का समर्थन करना चाहते हैं, तो आप sys.exc_info()इस तरह से फ़ंक्शन का उपयोग कर सकते हैं :

try:
    a = 1/'0'
except (ZeroDivisionError, TypeError):
    e = sys.exc_info()[1]
    print(e.args[0])

(स्रोत: http://python3porting.com/noconv.html )


2
नोट: यहाँ कुछ कोने के मामले हैं जिनसे अवगत होना है। Py3 में, asलक्ष्य (अपवाद जानकारी के बाकी हिस्सों के साथ) ब्लॉक से delबाहर निकलते ही अंतर्निहित रूप से एड होता है except(यह संग्रहीत ट्रेसबैक में शामिल कुछ चक्रीय संदर्भों को स्मृति की रिहाई में देरी से रोकता है जब तक चक्रीय जीसी चल नहीं जाता है )। इसलिए यह समतुल्य कोड थोड़ा कम समतुल्य है, जब तक कि आप ब्लॉक से बाहर निकलने से पहले यह सुनिश्चित करने के लिए ब्लॉक के try/finallyभीतर उपयोग करते हैं । exceptdel eexcept
21

0

पायथॉन 3.7 (अन्य संस्करणों के बारे में निश्चित नहीं) के रूप में 'अल्पविराम' वाक्यविन्यास किसी भी अधिक समर्थित नहीं है:

स्रोत फ़ाइल exception_comma.py:

try:
    result = 1/0
except Exception, e:
    print("An error occurred")
    exit(1)

exit(0)
  • $ python --version --> Python 2.7.10
$ python exception_comma.py
An error occurred
  • $ python3 --version --> Python 3.7.2
$ python3 exception_comma.py
  File "exception_comma.py", line 3
    except Exception, e:
                    ^
SyntaxError: invalid syntax
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.