2017-06-20 3 views
8

के बीच अंतर क्या उन दोनों के बीच अंतर है:क्या सिवाय और छोड़कर BaseException

except: 
    # do something 

और

except BaseException as be: 
    print(be) 

मैं पहले मामले सभी संभावित अपवाद के पकड़े जाते हैं में मतलब है, लेकिन यह है दूसरे के लिए सच है?

क्या पहले संदेश का उपयोग कर त्रुटि संदेश प्रिंट भी किया जा सकता है?

उत्तर

9

व्यवहार में, वहाँ except: और except BaseException: बीच कोई अंतर नहीं, किसी भी वर्तमान अजगर जारी करने के लिए है।

ऐसा इसलिए है क्योंकि आप किसी भी प्रकार की वस्तु को अपवाद के रूप में नहीं बढ़ा सकते हैं।

[...] उठाने के अपवाद वस्तु के रूप में पहली अभिव्यक्ति का मूल्यांकन करता है: raise statement स्पष्ट रूप से कुछ और ऊपर उठाने की अनुमति नहीं देता। यह या तो उप-वर्ग या BaseException का उदाहरण होना चाहिए।

बोल्ड जोर मेरा है। यह हमेशा मामला नहीं रहा है, हालांकि पुराने पायथन रिलीज (2.4 और इससे पहले) में आप अपवाद के रूप में तार का उपयोग कर सकते हैं।

लाभ तब होता है जब आपको पकड़े गए अपवाद तक आसानी से पहुंच मिलती है। as targetname जोड़ने में सक्षम होने के लिए, को अपवादों की एक विशिष्ट श्रेणी को पकड़ना चाहिए, और केवल BaseException ऐसा करने जा रहा है।

आप अभी भी हालांकि sys.exc_info() का उपयोग करके वर्तमान में सक्रिय अपवाद पहुँच सकते हैं:

except: 
    be = sys.ext_info()[1] 

उठाओ आप क्या महसूस अपने भविष्य स्वयं और आपके सहयोगियों के लिए और अधिक पठनीय है।

+2

जब तक आपने पहले 'बेसएक्सप्शन = वैल्यूएर'' जैसे कुछ नहीं रखा है ;-) 'को छोड़कर: 'किसी भी त्रुटि को छोड़कर हमेशा गारंटी देता है। –

+1

@a_guest: हाँ, * नाम * अभी भी रिबाउंड हो सकता है। 'buildins.BaseException' एक अच्छा फॉलबैक है, लेकिन मूर्खतापूर्ण नहीं है। –

संबंधित मुद्दे