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
deKeyboardInterrupt
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