20

में सभी अपवादों को पकड़ना पाइथन में, "सभी" अपवादों को पकड़ने का सबसे अच्छा तरीका क्या है?पायथन

except: # do stuff with sys.exc_info()[1] 

except BaseException as exc: 

except Exception as exc: 

पकड़ थ्रेड में निष्पादित हो सकता है।

मेरा उद्देश्य (जैसे खंड द्वारा के रूप में, जैसे कि वे प्रक्रिया समाप्ति आदि

अपवाद के लिए एक संभाल रही संकेत मिलता है के रूप में किसी विशेष अजगर अपवाद, मास्किंग के बिना किसी भी अपवाद है कि सामान्य कोड द्वारा फेंका जा सकता है लॉग इन करने की है ऊपर exc) भी वांछनीय है।

उत्तर

20

आप सभी अपवादों को पकड़ने और सभी के लिए समान सामान क्या करने की जरूरत है, तो मैं तुम्हें सुझाव देंगे इस:

try: 
    #stuff 
except: 
    # do some stuff 

आप नकाब "विशेष" अजगर अपवाद अपवाद का उपयोग नहीं करना चाहते हैं आधार वर्ग

try: 
    #stuff 
except Exception: 
    # do some stuff 
कुछ संबंधित प्रबंधन अपवाद के लिए

, उन्हें स्पष्ट रूप से पकड़ने:

try: 
    #stuff 
except FirstExceptionBaseClassYouWantToCatch as exc: 
    # do some stuff 
except SecondExceptionBaseClassYouWantToCatch as exc: 
    # do some other stuff based 
except (ThirdExceptionBaseClassYouWantToCatch, FourthExceptionBaseClassYouWantToCatch) as exc: 
    # do some other stuff based 

पायथन डॉक्स से exception hierarchy उपयोगी उपयोगी होना चाहिए।

+1

अपवाद पदानुक्रम के लिए लिंक के लिए धन्यवाद। :) – EOL

0

बुनियादी अपवादों को मास्क करने से बचने के लिए, आपको किसी भी अपवाद को "पुनः उठाना" आवश्यक है, जिसे आप स्पष्ट रूप से संभालना नहीं चाहते हैं, उदा। (8. Errors and Exceptions से रूपांतरित):

 
import sys

try: # do something that could throw an exception: except IOError as (errno, strerror): print "I/O error({0}): {1}".format(errno, strerror) except ValueError: print "Could not convert data to an integer." except: # maybe log the exception (e.g. in debug mode) # re-raise the exception: raise

+1

अंतिम 'छोड़कर: उठाएं' कुछ भी नहीं करता है: इसे पूरी तरह से छोड़ा जा सकता है; गैर-IOError और गैर-ValueError अपवादों को बस पकड़ा नहीं जाता है और दुभाषिया द्वारा स्वचालित रूप से उठाया जाता है। – EOL

+1

@EOL आप सही हैं। मैंने यह इंगित करने के लिए अपना जवाब संपादित किया है कि क्यों अंतिम को छोड़कर: उपयोगी हो सकता है। – Peter

29
  • except Exception: बनाम except BaseException::

    Exception और BaseException पकड़ने के बीच अंतर यह है कि exception hierarchy अपवाद SystemExit, KeyboardInterrupt और GeneratorExit तरह के अनुसार पकड़ा नहीं किया जाएगा except Exception का उपयोग करते समय वे सीधे BaseException से प्राप्त होते हैं।

  • except: बनाम except BaseException::

    इस दोनों के बीच अंतर (AFAIK) मुख्य रूप से अजगर 2 में है, और यह केवल जब एक पुरानी शैली वर्ग का उपयोग कर के रूप में एक अपवाद उठाया जा, इस मामले में केवल है अभिव्यक्ति कम खंड को छोड़कर अपवाद को पकड़ने में सक्षम हो जाएगा।

    class NewStyleException(Exception): pass 
    
    try: 
        raise NewStyleException 
    except BaseException: 
        print "Caught" 
    
    class OldStyleException: pass 
    
    try: 
        raise OldStyleException 
    except BaseException: 
        print "BaseException caught when raising OldStyleException" 
    except: 
        print "Caught" 
    
+2

मैंने आधिकारिक तौर पर अनुशंसित की गई 'अपवाद' से 'न्यू स्टाइल एक्सेप्शन' का उत्तराधिकारी बनाया है (http://docs.python.org/tutorial/errors.html#user-defined-exceptions)। – EOL