¿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?
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