Mala idea para atrapar todas las excepciones en Python

¿Por qué es una mala idea atrapar todas las excepciones en Python?

Entiendo que capturar todas las excepciones usando la cláusula except: incluso detectará las excepciones “especiales” de python: SystemExit , KeyboardInterrupt , y GeneratorExit . Entonces, ¿por qué no usar simplemente una except Exception: para detectar todas las excepciones?

Porque es terriblemente inespecífico y no te permite hacer nada interesante con la excepción. Además, si está detectando todas las excepciones, podría haber un montón de excepciones que están sucediendo y que ni siquiera sabe que están sucediendo (lo que podría hacer que su aplicación falle sin que realmente sepa por qué). Debería poder predecir (ya sea mediante la lectura de la documentación o la experimentación) específicamente qué excepciones necesita manejar y cómo manejarlas, pero si las suprime a ciegas desde el principio, nunca lo sabrá.

Entonces, por petición popular, aquí hay un ejemplo. Un progtwigdor está escribiendo el código Python y obtiene un IOError . En lugar de seguir investigando, decide atrapar todas las excepciones:

 def foo(): try: f = open("file.txt") lines = f.readlines() return lines[0] except: return None 

Ella no se da cuenta del problema en sus formas: ¿qué pasa si el archivo existe y es accesible, pero está vacío? Entonces este código generará un IndexError (ya que las lines la lista están vacías). Así que pasará horas preguntándose por qué no obtiene None respuesta de esta función cuando existe el archivo y no está bloqueada sin darse cuenta de algo que sería obvio si hubiera sido más específica en la captura de errores, que es el hecho de que está accediendo a datos que podrían no hacerlo. existe.

Porque probablemente quieras manejar cada excepción de manera diferente. No es lo mismo tener un KeyInterrupt que tener un problema de encoding o un sistema operativo … Puede detectar excepciones específicas una tras otra.

 try: XXX except TYPE: YYY except TYPE: ZZZ