2011-10-10 17 views
9

¿Cuál es un buen patrón para evitar la duplicación de código cuando se trata de diferentes tipos de excepciones en Python, por ej. Quiero tratar URLError y HTTPError simlar pero no del todo:Python: ¿cómo evitar la duplicación de código en la captura de excepciones?

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()) 

En este ejemplo, me gustaría evitar la duplicación de la primera llamada logger.error. Dada URLError es el padre de HTTPError uno podría hacer algo como esto:

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 

Otro enfoque sería utilizar isinstance por ejemplo. Si URLError y HTTPError no estarían en una cadena de herencia:

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

, cual debe preferir, ¿hay otra mejor enfoque?

Respuesta

10

Creo que su tercer ejemplo es la mejor solución.

  • Es la versión más corta
  • Se evita la duplicación
  • Está claro para leer y fácil de seguir, tanto a diferencia de la segunda versión.

Es posible que desee utilizar la sintaxis except FooError as err más reciente, si está en Python 2.6 o superior.

Además, en su ejemplo, la primera versión no es del todo correcta ya que el controlador URLError ya capta el HTTPError, por lo que nunca se llega a la parte except HTTPError. Tendría que cambiar los dos except s alrededor. Otra razón para no usar esto.

+0

Gracias Tim! Eso es convincente. Estupendo, detectó el orden URLError, HTTPError en el primer ejemplo. No edito la pregunta ya que indica claramente el problema con ese ejemplo como mencionaste en tu respuesta. – Bernhard

Cuestiones relacionadas