2011-08-09 2 views
18

J'écris actuellement une classe wrapper. Je veux pouvoir enregistrer les exceptions correctement mais permettre aux méthodes d'appel d'être conscientes des exceptions qui se produisent. Ma classe ressemble à ceci:Exception de journalisation Python

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 

Je suis un peu dubitative sur la capture et exception juste pour l'enregistrer et puis re-soulever si le code d'appel peut faire quelque chose à ce sujet. Quel est le modèle approprié ici?

+0

double possible (http [logging exception python]: // stackoverflow.com/questions/5191830/python-exception-logging) – lpapp

+0

C'est exactement ce que je fais. Merci d'avoir posté cette question. – smwikipedia

Répondre

22

Il n'y a rien de mal à attraper pour se connecter. Cependant, je vous recommande:

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 

En faisant juste un nu raise vous préservez la pleine info retraçage. Il est également plus explicite de mettre du code qui ne se produira que si vous n'avez pas d'exception dans la clause else, et il est plus clair de quelle ligne vous attrapez une exception.

Il serait également bon pour la classe appelante de faire la journalisation si elle gère l'erreur de toute façon, mais cela peut ne pas convenir à votre application. Éditer: La documentation pour try ... except ... else ... finally est sous compound statements.

+0

Est-ce que le dernier mot-clé est supposé être "excepté" au lieu de "else" ou est-ce que cela sert à quelque chose? – jlafay

+4

C'est supposé être 'else'. La clause 'else' ne se produit que s'il n'y a pas d'exception, tout comme la clause' else' sur les boucles 'for' et' while' ne se produit que si vous n'avez pas '' break''. – agf

+0

Génial! Merci pour l'explication. – jlafay

6

Cette méthode est correcte, bien qu'au lieu de raise e vous devez simplement utiliser raise, ce qui va automatiquement sur-relancer la dernière exception. C'est aussi l'un des rares cas où l'utilisation d'une couverture except est considérée comme acceptable.

Voici un exemple très semblable à ce que vous faites des docs Python sur Handling Exceptions:

La dernière clause d'exception peut omettre le nom d'exception (s), pour servir comme joker. Utilisez ceci avec une extrême prudence, car il est facile de masquer une erreur de programmation réelle de cette façon! Il peut également être utilisé pour imprimer un message d'erreur et reraise l'exception (ce qui permet à un appelant de gérer l'exception ainsi):

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 
Questions connexes