Python: captura múltiples excepciones en una línea

En este artículo, hemos repasado cómo capturar múltiples excepciones en una línea en Python, con ejemplos de código. También hemos cubierto algunas malas prácticas y cómo evitarlas.

Introducción

En este artículo vamos a echar un vistazo a la cláusula try/except, y específicamente cómo puede capturar múltiples excepciones en una sola línea, así como también cómo usar el método suppress().

Ambas técnicas te ayudarán a escribir código más accesible y versátil que se adhiera a los principios SECOS (no te repitas).

Empecemos analizando el problema:

1
2
3
4
5
6
7
8
try:
    do_the_thing()
except TypeError as e:
    do_the_other_thing()
except KeyError as e:
    do_the_other_thing()
except IndexError as e:
    do_the_other_thing()

Brutal.

Como podemos ver, este es un código muy HÚMEDO, repetimos la misma invocación varias veces. Prácticas como esta pueden hacer que la lectura y refactorización de nuestro código sea una pesadilla viviente.

En lugar de escribir excepciones una tras otra, ¿no sería mejor agrupar todos estos manejadores de excepciones en una sola línea?

Múltiples excepciones {#múltiples excepciones}

Si solo está aquí para obtener una respuesta rápida, es simple: use una tupla.

Todos los errores contenidos en la tupla de línea de excepción se evaluarán juntos:

1
2
3
4
try:
    do_the_thing()
except (TypeError, KeyError, IndexError) as e:
    do_the_other_thing()

Fácil, ¿verdad?

Evitar las malas prácticas {#evitar las malas prácticas}

"Los errores nunca deben pasar en silencio." - [El Zen de Python](https://www.python.org/dev/peps/pep-0020/#:~:text=Errors%20should%20never%20pass %20en silencio,obvia%20manera%20de%20hacer%20lo.).

Las cláusulas try/except son probablemente el patrón más mal utilizado en Python.

Usados ​​incorrectamente, terminan siendo el cliché de los borrachos y los postes de luz, y se usan solo cuando el intérprete de Python comienza a cantar los "12 errores de Navidad".

Es muy tentador simplemente poner un ‘intento’ y una simple excepción en un problema para "hacer que desaparezca". Al hacer eso, estamos barriendo las excepciones bajo la alfombra, lo cual es una pena, especialmente porque pueden ser de gran ayuda para recuperarse de errores potencialmente fatales o arrojar luz sobre errores ocultos.

Es por eso que al usar cláusulas de excepción, siempre debe asegurarse de especificar los errores que sabe que podría encontrar y excluir los que no.

Dejar que tu programa falle está bien, incluso es preferible, a fingir que el problema no existe.

"Los errores nunca deben pasar en silencio... a menos que se silencien explícitamente."

Sin embargo, de vez en cuando, cuando tenga la oportunidad de ignorar el manejo de excepciones, puede usar suppress():

1
2
3
4
from contextlib import suppress

with suppress(TypeError, KeyError, IndexError):
    do_the_thing()

El método suppress() toma una serie de excepciones como argumento y realiza un try/except/pass con esos errores. Como puede ver, también le permite escribir múltiples excepciones en una sola línea.

Esto le permite evitar escribir intentar/excepto/aprobar manualmente:

1
2
3
4
try:
    do_the_thing()
except (TypeError, KeyError, IndexError) as e:
    pass

Mejor aún, ¡también es estándar en cualquier versión de Python 3.4 y superior!

Conclusión

En este artículo, hemos cubierto cómo manejar múltiples excepciones en una sola línea. También hemos repasado brevemente algunas malas prácticas de ignorar excepciones y usamos la función supress() para suprimir excepciones explícitamente. tamente.

Licensed under CC BY-NC-SA 4.0