2012-05-15 16 views
7

¿Por qué es una mala idea capturar todas las excepciones en Python?Mala idea para detectar todas las excepciones en Python

entiendo que la captura de todas las excepciones que utilizan la cláusula except: incluso detectar las excepciones 'especiales' Python: SystemExit, KeyboardInterrupt y GeneratorExit. Entonces, ¿por qué no simplemente usar una cláusula except Exception: para captar todas las excepciones?

+6

Tengo que coger 'em todo – jamylak

+0

supongo que es mejor para atrapar todo en un código de producción, pero a medida que se desarrolla el software, se puede hacer que su código sea difícil para la depuración .... –

+4

@jamylak: http: //stephenvick.wordpress.com/2010/08/02/pokemon-exception-handling/ –

Respuesta

20

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

Por petición popular, he aquí un ejemplo. Un programador está escribiendo el código de Python y ella obtiene un IOError. En lugar de investigar más a fondo, decide capturar todas las excepciones:

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

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

+0

@Raffe: ¿Puedes dar ejemplos específicos, por favor? – Bandicoot

+0

@Bandicoot ejemplos específicos de por qué atrapar todas las excepciones es una mala idea? –

+0

@Raffe: Sí. Me ayudará a entender mejor tu respuesta. Gracias ! – Bandicoot

3

Porque probablemente quiera manejar cada excepción de manera diferente. No es lo mismo tener un KeyInterrupt que tener un problema de codificación, o un sistema operativo ... Puedes atrapar excepciones específicas una después de la otra.

try: 
    XXX 
except TYPE: 
    YYY 
except TYPE: 
    ZZZ 
Cuestiones relacionadas