2011-10-10 9 views
9

पायथन में विभिन्न अपवाद प्रकारों से निपटने के दौरान कोड डुप्लिकेशन से बचने के लिए एक अच्छा पैटर्न क्या है, उदाहरण के लिए। मैं URLError के इलाज के लिए और HTTPError simlar लेकिन काफी नहीं चाहता:पायथन: अपवाद में कोड डुप्लिकेशन से कैसे बचें?

try: 
    page = urlopen(request) 
except URLError, err: 
    logger.error("An error ocurred %s", err) 
except HTTPError, err: 
    logger.error("An error occured %s", err) 
    logger.error("Error message: %s", err.read()) 

इस उदाहरण में, मैं पहली बार logger.error कॉल के दोहराव से बचने करना चाहते हैं। यह देखते हुए URLError HTTPError की मूल एक कुछ इस तरह कर सकता है:

except URLError, err: 
    logger.error("An error occurred %s", err) 
    try: 
     raise err 
    except HTTPError, err: 
     # specialization for http errors 
     logger.error("Error message: %s", err.read()) 
    except: 
     pass 

एक और दृष्टिकोण isinstance जैसे उपयोग करने के लिए किया जाएगा। यदि URLError और HTTPError विरासत की एक श्रृंखला में नहीं होगा:

except (URLError, HTTPError), err: 
    logger.error("An error occured %s", err) 
    if isinstance(err, HTTPError): 
     logger.error("Error message: %s", err.read()) 

एक कौन सा मैं पसंद करना चाहिए, वहाँ एक और बेहतर तरीका है?

उत्तर

10

मुझे लगता है कि आपका तीसरा उदाहरण सबसे अच्छा समाधान है।

  • यह कम से कम संस्करण
  • यह दोहराव से बचा जाता है है
  • यह पढ़ने के लिए स्पष्ट और पालन करने के लिए आसान है, दूसरे संस्करण के विपरीत काफी है।

आप नए except FooError as err वाक्यविन्यास का उपयोग करना चाहेंगे, हालांकि, यदि आप पाइथन 2.6 या उच्चतर हैं।

इसके अलावा, अपने उदाहरण में, पहले संस्करण नहीं काफी सही के बाद से URLError हैंडलर पहले से ही HTTPError पकड़ता है, तो except HTTPError भाग तक पहुँच कभी नहीं रहा है। आपको दो except एस को चारों ओर स्विच करना होगा। इसका उपयोग करने का एक और कारण नहीं है।

+0

धन्यवाद टिम! यह विश्वास है। बढ़िया आपने URLError, HTTPError को पहले उदाहरण में ऑर्डर करने के लिए देखा। मैं इस सवाल को संपादित नहीं करता क्योंकि यह स्पष्ट रूप से उस उदाहरण के साथ समस्या को इंगित करता है जैसा आपने अपने उत्तर में बताया था। – Bernhard

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