इसके अलावा अंतर: और अपवाद को अपवाद के रूप में ई: पायथन में


140

कोड के निम्नलिखित स्निपेट दोनों एक ही काम करते हैं। वे हर अपवाद को पकड़ते हैं और except:ब्लॉक में कोड निष्पादित करते हैं

स्निपेट 1 -

try:
    #some code that may throw an exception
except:
    #exception handling code

स्निपेट 2 -

try:
    #some code that may throw an exception
except Exception as e:
    #exception handling code

दोनों निर्माणों में वास्तव में क्या अंतर है?


7
@ user2725093 यही सवाल नहीं है। एक आप से जुड़ा हुआ पूछता है के बीच अंतर क्या except Exception, e:है और except Exception as e:। यह सवाल पूछता है कि क्या अंतर है except:और except Exception as e:
डेनिस

जवाबों:


155

दूसरे में आप अपवाद ऑब्जेक्ट की विशेषताओं तक पहुँच सकते हैं:

>>> def catch():
...     try:
...         asd()
...     except Exception as e:
...         print e.message, e.args
... 
>>> catch()
global name 'asd' is not defined ("global name 'asd' is not defined",)

लेकिन यह BaseExceptionअपवाद या सिस्टम-एक्ज़िटिंग अपवादों को नहीं पकड़ता SystemExit, KeyboardInterruptऔर GeneratorExit:

>>> def catch():
...     try:
...         raise BaseException()
...     except Exception as e:
...         print e.message, e.args
... 
>>> catch()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in catch
BaseException

जो एक नंगे को छोड़कर करता है:

>>> def catch():
...     try:
...         raise BaseException()
...     except:
...         pass
... 
>>> catch()
>>> 

डॉक्स के अंतर्निहित अपवाद अनुभाग और अधिक जानकारी के लिए ट्यूटोरियल के त्रुटियां और अपवाद अनुभाग देखें।


22
वैसे, यहां कोई जादू नहीं है। Exceptionसे लिया गया है BaseException, इसीलिए except Exceptionपकड़ में नहीं आता है BaseException। यदि आप लिखते हैं except BaseException, तो यह भी पकड़ा जाएगा। नंगे exceptही सब कुछ पकड़ लेता है।
फ़जरी

2
मुझे इंगित करना चाहिए कि एक नंगे exceptको exceptब्लॉक की एक श्रृंखला में अंतिम होना चाहिए , जबकि आपको except Exceptionअन्य exceptब्लॉकों से पहले डालने पर कोई त्रुटि नहीं होगी : वे सिर्फ चुपचाप नजरअंदाज कर देंगे (यदि वे Exceptionउपवर्ग संभालते हैं )। देखने के लिए कुछ।
वैनेसा फिप्स

@MatthewPhipps यह बिंदु की तरह है, है ना? केस स्टेटमेंट या अगर-और ब्लॉक की तरह, निष्पादन पहली शर्त से मेल खाती है ...
बुनियादी

1
@ बासिक बस नंगे exceptऔर के बीच एक और अंतर को इंगित करता है except Exception। "कुछ देखने के लिए" अब थोड़ा अजीब लग रहा है, लेकिन उस समय exceptजहां मैंने पायथन से सबसे विशिष्ट ब्लॉक लेने की उम्मीद की थी , चाहे वह कहीं भी हो, और अन्यथा पता लगाने के लिए थोड़ा निराश था।
वैनेसा फिप्स

यह भी ध्यान देने योग्य है कि दूसरे रूप का उपयोग केवल तभी किया जाना चाहिए जब आपको इस बात की परवाह न हो कि अपवाद क्या था या इसे सार्थक तरीके से संभालना चाहते थे।
जोश जे

51
except:

सभी अपवादों को स्वीकार करता है, जबकि

except Exception as e:

केवल अपवाद है कि आप कर रहे हैं स्वीकार करता है मतलब पकड़ करने के लिए।

यहाँ एक उदाहरण है जिसे आप पकड़ने के लिए नहीं हैं:

>>> try:
...     input()
... except:
...     pass
... 
>>> try:
...     input()
... except Exception as e:
...     pass
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyboardInterrupt

पहले वाले ने चुप्पी साध ली KeyboardInterrupt!

यहाँ एक त्वरित सूची है:

issubclass(BaseException, BaseException)
#>>> True
issubclass(BaseException, Exception)
#>>> False


issubclass(KeyboardInterrupt, BaseException)
#>>> True
issubclass(KeyboardInterrupt, Exception)
#>>> False


issubclass(SystemExit, BaseException)
#>>> True
issubclass(SystemExit, Exception)
#>>> False

यदि आप उनमें से किसी को पकड़ना चाहते हैं, तो ऐसा करना सबसे अच्छा है

except BaseException:

इंगित करने के लिए कि आप जानते हैं कि आप क्या कर रहे हैं।


सभी अपवादों से उपजी है BaseException, और जिन्हें आप दिन-प्रतिदिन पकड़ने के लिए हैं (जिन्हें प्रोग्रामर के लिए फेंक दिया जाएगा ) से विरासत में मिला है Exception


except(Exception)KeyboardInterruptत्रुटियों को कभी नहीं पकड़ता है । as eइससे कोई लेना-देना नहीं है।
पंडिता

2
मैंने कभी नहीं कहा कि यह किया। मैंने एक बार इसका उल्लेख नहीं किया है as e, क्योंकि मैंने मान लिया है कि यह स्पष्ट है कि यह क्या करता है।
विड्राक

2
क्या कोई ऐसा मामला है जहां कोई व्यक्ति BaseException को पकड़ता है और जानता है कि वे क्या कर रहे हैं?
दावोस

2
@Davos हाँ, आप इसे क्षणिक लॉगिंग करते समय पसंद कर सकते हैं, या यदि आप उस उपयोगकर्ता को एक सांत्वना दे रहे हैं जिसे आप अपवाद नहीं चाहते हैं SystemExitया उससे KeyboardInterruptबचना चाहते हैं । सामान्य मामला नहीं है, लेकिन ऐसा होता है।
विड्राक

14

कुछ अपवादों के साथ मतभेद हैं, जैसे कि KeyboardInterrupt।

PEP8 पढ़ना :

एक नंगे को छोड़कर: क्लॉज़ सिस्टमएक्सिट और कीबोर्डइंटरप्ट अपवादों को पकड़ लेगा, जिससे कंट्रोल-सी के साथ एक कार्यक्रम को बाधित करना मुश्किल हो जाएगा, और अन्य समस्याओं का सामना करना पड़ सकता है। यदि आप प्रोग्राम अपवादों को इंगित करने वाले सभी अपवादों को पकड़ना चाहते हैं, तो अपवाद को छोड़कर उपयोग करें: (नंगे को छोड़कर, अपवाद अपवाद को छोड़कर :)।


3

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


1

इसे देखने का एक और तरीका। अपवाद के विवरण की जाँच करें:

In [49]: try: 
    ...:     open('file.DNE.txt') 
    ...: except Exception as  e: 
    ...:     print(dir(e)) 
    ...:                                                                                                                                    
['__cause__', '__class__', '__context__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__suppress_context__', '__traceback__', 'args', 'characters_written', 'errno', 'filename', 'filename2', 'strerror', 'with_traceback']

"ई" सिंटैक्स का उपयोग करने के लिए बहुत सी "चीजें" हैं।

यह कोड केवल इस उदाहरण का विवरण दिखाने के लिए था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.