2009-04-16 14 views

Respuesta

25

Se considera una buena práctica no detectar normalmente el objeto raíz Excepción, sino detectar los más específicos, por ejemplo IOException.

Considere si se produjo una excepción de falta de memoria: simplemente usar "pasar" no dejará su programa en buen estado.

Casi la única vez que debe atrapar Exception se encuentra en el nivel superior de su programa, donde puede (intentar) iniciar sesión, mostrar un error y salir tan elegantemente como pueda.

+2

este mal hábito también generará pesadillas de depuración considerables.Especialmente cuando otras excepciones a las que has pensado se plantean dentro de tu try/except. Y esto simplemente sucede ... – vaab

3

porque cree que está atrapando demasiado. y es correcto

1

Las excepciones se producen cuando ocurre algo ... excepcional. Por lo general, es bueno que el programa finalice.

Es posible que desee ignorar algunas excepciones, pero IMO no hay una buena razón para atrapar una clase base como esa.

+4

Hola. No creo que esté de acuerdo en que "no hay una buena razón". Me puedo imaginar, por ejemplo, un programa GUI que genera una excepción cuando se intenta una operación en particular en un conjunto de datos particularmente complicado. Está bien que un programador diga que una excepción inesperada debe terminar el programa con un seguimiento de pila (falla antes), pero en la práctica lo que el usuario quiere es que la operación actual falle con elegancia, tal vez con un mensaje o un archivo de registro , y luego para que la GUI continúe operando para que puedan, por ejemplo guarde sus datos antes de que suceda algo malo. –

+1

Estoy totalmente de acuerdo, me refería a la forma en que el OP ignora las excepciones con 'pass'. Debería haber aclarado mi punto. –

+0

Disculpe, justo entonces. –

-1

La captura de excepciones (sin volver a aumentar) tiene 2 efectos secundarios realmente malos: come errores, por lo que pierde el seguimiento de la pila, pero también ctrl-c (o la clave de interrupción en su sistema operativo) también manejado aquí.

El comportamiento típico de programas como este es que o bien no se pueden detener, o bien que ctrl-c hace que el flujo de control salte hacia adelante (al manejador de excepciones) y luego continúa. Entonces, o bien el código no puede ser interrumpido, o necesita martillar en ctrl-c para que se detenga.

+2

Esto ya no es cierto de Python 2.6, KeyboardInterrupt ya no hereda de Exception. –

+0

No pierde el rastro de la pila. Simplemente use el módulo 'traceback' con sys.exc_info(). – PeqNP

15

Es una buena práctica atrapar solo una gama muy estrecha de tipos. 'Excepción' es demasiado general: terminará atrapando no solo los errores que había planeado, sino también otros errores que pueden enmascarar errores en su código que serían más rápidos de diagnosticar si no se detectaran, o posiblemente lo haría será mejor manejado por un solo manejador de excepciones de muy alto nivel.

Dicho esto, desde Python2.6, la captura de Exception se ha vuelto mucho más razonable, ya que todas las excepciones que no desea atrapar (SystemExit, KeyboardInterrupt) ya no heredan de Exception. En su lugar, heredan de una BaseException común. Esto se ha hecho deliberadamente para que la captura de Exception sea relativamente inofensiva, ya que es una expresión tan común.

Ver PEP 3110 para más detalles & planes futuros.

0

como la respuesta de Greg, 'Excepción' es una clase base y las excepciones deben derivarse de esta clase, ver también exceptions.Exception.

Aquí una muy útil lista de errores en pydocs

Tenga en cuenta también el módulo de rastreo muy útil que le permite averiguar dónde se encuentra la excepción ocurrió. Usar solo 'excepto: ...' le mostrará qué Error debe usar mejor en su caso. Por ejemplo, pruebe este código (alternar el comentario), quizás lo acepte:

import traceback 
#absent = 'nothing' 
try: 
    something = absent 
except NameError: 
    traceback.print_exc() 
else: 
    print("you get here only when you uncomment 'absent'") 
Cuestiones relacionadas