try tipos recent most last jerarquia excepciones errores ejemplos diferentes comunes python exception-handling

tipos - traceback most recent call last): python



Manejar excepción arbitraria, imprimir mensaje de excepción predeterminado (5)

Considere usar el módulo de registro de Python, esto le dará mucha funcionalidad para registrar problemas para una inspección posterior. A continuación se muestra un ejemplo simple de uso del módulo de registro para registrar excepciones:

import logging LOG_FILE = ''/tmp/exceptions.log'' logging.basicConfig(filename=LOG_FILE,level=logging.ERROR) while True: try: # Code that may throw exceptions except Exception, e: logging.exception("An exception happened")

Al utilizar la función logging.exception dentro de un controlador de excepciones como se hace aquí, la información de Excepción se agrega automáticamente al mensaje de registro.

Tengo un programa, una parte del cual ejecuta un bucle. Durante la ejecución de este bucle, hay excepciones. Obviamente, me gustaría que mi programa se ejecute sin errores, pero por el bien del progreso, me gustaría que el programa se ejecute en toda la entrada y no se detenga cuando se produce una excepción. La forma más sencilla de hacerlo sería mediante la implementación de un bloque de except .

Sin embargo, cuando hago esto, con except todas las excepciones, continúa con el programa y nunca veo el mensaje de excepción, que necesito para depurar.

¿Hay alguna forma de except cualquier excepción arbitraria y poder imprimir el mensaje de excepción en el bloque de except ?


Me parece que esto es mucho más útil para la depuración:

from traceback import print_exc try: raise Exception("doh!") except: print_exc()


Si bien la respuesta de James es casi siempre lo que realmente quieres, no es exactamente lo que pidió el OP:

¿Hay alguna forma de exceptuar cualquier excepción arbitraria y poder imprimir el mensaje de excepción en el bloque de excepción?

Exception no controla realmente todas las excepciones, solo todas las excepciones que normalmente desea capturar. En particular, en 2.5 y posteriores:

Todas las excepciones integradas que no se salen del sistema se derivan de esta clase. Todas las excepciones definidas por el usuario también deben derivarse de esta clase.

Esto deja fuera algunas cosas:

  • excepciones integradas en el sistema, como un KeyboardInterrupt de KeyboardInterrupt del usuario que golpea ^C (solo 2.5 y posteriores)
  • Excepciones definidas por el usuario que no siguen ese "debería"

Muy ocasionalmente, desea manejar cosas como KeyboardInterrupt , en cuyo caso usa BaseException lugar de Exception . (Consulte la jerarquía de excepciones para obtener una lista de las excepciones que son y no las subclases de Exception ). Por lo tanto:

try: # stuff except BaseException as e: print e

Y (generalmente de forma temporal mientras se realiza la depuración) a veces realmente quieres manejar absolutamente todo. En 2.7, eso incluye excepciones definidas como clases de estilo antiguo; en 2.5 y anteriores, también incluye cadenas. La única forma de manejar todas esas posibilidades es usar un sys.exc_info except y luego usar sys.exc_info (y, opcionalmente, volver a raise cualquier cosa que no quieras manejar):

try: # stuff except: type, value, traceback = sys.exc_info() print value

Como nota al margen, estoy usando el nuevo estilo except sintaxis ( except Exception as e ) anterior. Esto funciona en 2.6 y versiones posteriores, incluyendo 3.x. La sintaxis de estilo antiguo ( except Exception, e ) está en desuso en 2.6, y deja de funcionar en 3.0, pero si desea trabajar con versiones anteriores 2.x, debe usarla.


try: #stuff except Exception as e: print e

El módulo de traceback proporciona varias funciones para extraer más información del objeto de excepción ( e , arriba).

Errores de fuente y excepciones


while True: try: # Do your stuff except Exception, e: print "Something happened: %s" % e