try que manejar jerarquia excepciones errores python pylint

que - try except python 3



advertencia de pylint en ''excepto excepción:'' (6)

Es una buena práctica capturar solo una gama muy estrecha de tipos. La "excepción" es demasiado general: terminará atrapando no solo los errores que planeó, 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 detectaron, o posiblemente ser manejado mejor por un solo controlador de excepciones de muy alto nivel.

Dicho esto, desde Python2.6, la captura de Exception se ha vuelto mucho más razonable, porque todas las excepciones que no querría capturar (SystemExit, KeyboardInterrupt) ya no se 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 un lenguaje tan común.

Ver PEP 3110 para detalles y planes futuros.

Para un bloque como este:

try: #some stuff except Exception: pass

pylint genera advertencia W0703 ''Captura "Excepción"''. ¿Por qué?


La excepción de captura (sin volver a subir) tiene 2 efectos secundarios muy malos: los errores se comen, por lo que se pierde el seguimiento de la pila, pero también se controla aquí el control ctrl-c (o cualquiera que sea la clave de interrupción en su sistema operativo).

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


Las excepciones se generan cuando ocurre algo ... excepcional. Generalmente es bueno que el programa termine.

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


Porque piensa que estás cogiendo demasiado. y es correcto


Se considera una buena práctica no capturar normalmente el objeto de excepción raíz, sino captar objetos más específicos, por ejemplo, IOException.

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

Casi la única vez que debería capturar Excepción es en el nivel superior de su programa, donde puede (intentar) iniciar sesión, mostrar un error y salir tan bien como sea posible.


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

Aquí una lista muy útil de errores en pydocs

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

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