2011-08-09 10 views
18

Actualmente estoy escribiendo una clase contenedora. Deseo poder registrar las excepciones correctamente pero permitir que los métodos de llamada estén al tanto de las excepciones que se producen. Mi clase es el siguiente:Excepción de inicio de 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 

estoy un poco dudosa acerca de la captura y la excepción sólo para conectarse y luego volver a levantarla por lo que el código de llamada se puede hacer algo al respecto. ¿Cuál es el patrón correcto aquí?

+0

posible duplicado de [pitón registro de excepción] (http: // stackoverflow.com/questions/5191830/python-exception-logging) – lpapp

+0

Eso es exactamente lo que estoy haciendo. Gracias por publicar esta pregunta. – smwikipedia

Respuesta

22

No hay nada de malo en capturar para iniciar sesión. Sin embargo, me gustaría recomendar:

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 

con sólo hacer un desnudo raise a preservar la información de trazabilidad completa. También es más explícito poner código que solo sucederá si no tiene una excepción en la cláusula else, y está más claro de qué línea está capturando una excepción.

También estaría bien que la clase de llamada realice el registro si está manejando el error de todos modos, pero puede no ser conveniente para su aplicación.

Editar: La documentación para try ... except ... else ... finally está por debajo de compound statements.

+0

¿Se supone que la última palabra clave es "excepto" en lugar de "else" o sirve para algún propósito? – jlafay

+4

Se supone que es 'else'. La cláusula 'else' ocurre solo si no hubo excepción, al igual que la cláusula' else' en los ciclos 'for' y' while' solo suceden si no 'break' out. – agf

+0

¡Impresionante! Gracias por la explicación. – jlafay

6

Ese método es correcto, aunque en lugar de raise e debe usar raise, que automáticamente volverá a subir la última excepción. Este es también uno de los pocos casos en los que se considera aceptable el uso de una manta except.

Este es un ejemplo muy similar a lo que está haciendo de la documentación de Python en Handling Exceptions:

La última cláusula except puede omitir el nombre (s) excepción, para servir como un comodín. Úselo con extrema precaución, ya que es fácil enmascarar un error de programación real de esta manera. También se puede utilizar para imprimir un mensaje de error y luego volver a subir la excepción (que permite una persona que llama para manejar la excepción también):

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 
Cuestiones relacionadas