2011-08-09 17 views
18

मैं वर्तमान में एक रैपर वर्ग लिख रहा हूं। मैं अपवादों को ठीक से लॉग इन करने में सक्षम होना चाहता हूं लेकिन कॉलिंग विधियों को अपवादों के बारे में जागरूक होने की अनुमति देता हूं। मेरी कक्षा इस तरह दिखता है:पायथन लॉगिंग अपवाद

import logging 

log = logging.getLogger('module') 

class MyAPIWrapper(library.APIClass): 

    def __init__(self): 
     self.log = logging.getLogger('module.myapiwrapper') 


    def my_wrapper_method(self): 
     try: 
      response = self.call_api_method() 
      return response.someData 
     except APIException, e: 
      self.log.exception('Oh noes!') 
      raise e #Throw exception again so calling code knows it happened 

मैं पकड़ने और अपवाद बस इसे क्लिक करें और फिर पुन: ऊपर उठाने यह इतना बुला कोड को इसके बारे में कुछ कर सकते हैं करने के लिए के बारे में थोड़ा संदिग्ध हूँ। यहां उचित पैटर्न क्या है?

+0

[अजगर अपवाद लॉगिंग] (http के संभावित डुप्लिकेट: // stackoverflow.com/questions/5191830/python-exception-logging) – lpapp

+0

यह वही है जो मैं कर रहा हूं। इस सवाल को पोस्ट करने के लिए धन्यवाद। – smwikipedia

उत्तर

22

लॉग इन करने के साथ कुछ भी गलत नहीं है। हालांकि, मैं सलाह देते हैं:

try: 
     response = self.call_api_method() 
    except APIException, e: # or 'as e' depending on your Python version 
     self.log.exception('Oh noes!') 
     raise #Throw exception again so calling code knows it happened 
    else: 
     return response.someData 

सिर्फ एक नंगे raise आप पूर्ण ट्रैस बैक की जानकारी की रक्षा करने से। कोड को रखना भी अधिक स्पष्ट है जो केवल तब होगा जब आपके पास else खंड में कोई अपवाद नहीं है, और यह स्पष्ट है कि आप किस लाइन से अपवाद प्राप्त कर रहे हैं।

कॉलिंग क्लास लॉगिंग करने के लिए भी ठीक होगा अगर यह त्रुटि को किसी भी तरह से संभाला जा रहा है, लेकिन यह आपके ऐप के लिए सुविधाजनक नहीं हो सकता है।

संपादित करें: try ... except ... else ... finally के लिए प्रलेखन compound statements के अंतर्गत है।

+0

क्या अंतिम कीवर्ड "अन्यथा" के बजाय "छोड़कर" होना चाहिए या क्या यह कुछ उद्देश्य प्रदान करता है? – jlafay

+4

यह 'else' होना चाहिए। 'Else' क्लॉज केवल तभी होता है जब कोई अपवाद नहीं था,' ''' 'पर' else' 'क्लॉज की तरह और' जबकि 'लूप केवल तभी होते हैं जब आपने' ब्रेक 'नहीं किया हो। – agf

+0

बहुत बढ़िया! स्पष्टीकरण के लिए धन्यवाद। – jlafay

6

यह विधि सही है, हालांकि raise e के बजाय आपको केवल raise का उपयोग करना चाहिए, जो स्वचालित रूप से अंतिम अपवाद को फिर से उठाएगा। यह दुर्लभ मामलों में से एक है जहां कंबल except का उपयोग स्वीकार्य माना जाता है।

पिछले खंड को छोड़कर, अपवाद नाम (रों) छोड़ सकते हैं वाइल्डकार्ड के रूप में सेवा करने के लिए:

यहाँ बहुत क्या आप Handling Exceptions पर अजगर डॉक्स से कर रहे हैं के लिए इसी तरह एक उदाहरण है। चरम सावधानी के साथ इसका प्रयोग करें, क्योंकि इस तरह से एक वास्तविक प्रोग्रामिंग त्रुटि मुखौटा करना आसान है! यह भी एक त्रुटि संदेश मुद्रित करने के लिए और फिर अपवाद (अपवाद को संभालने के लिए और साथ ही एक फोन करने वाले की अनुमति) फिर से बढ़ा इस्तेमाल किया जा सकता:

import sys 

try: 
    f = open('myfile.txt') 
    s = f.readline() 
    i = int(s.strip()) 
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: 
    print "Unexpected error:", sys.exc_info()[0] 
    raise 
संबंधित मुद्दे