2010-01-05 16 views
17

Tengo un programa, una parte del cual ejecuta un ciclo. Durante la ejecución de este ciclo, 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 lanza una excepción. La forma más fácil de hacerlo sería implementando un bloque except.Manejar Excepciones arbitrarias, Imprimir mensaje de excepción predeterminado

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

¿Hay alguna manera de except de realizar una excepción arbitraria y poder imprimir el mensaje de excepción en el bloque except?

Respuesta

17
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).

Fuente Errors and Exceptions

+3

Tenga en cuenta que la sintaxis 'Exception, e' está en desuso a partir de 2.6 y deja de funcionar a partir de 3.0. Si tiene un código que debe funcionar tanto con 2.x como con 3.x, use 'Exception as e' en su lugar. (Sin embargo, si necesita trabajar con 2.5 o anterior, debe usar esta sintaxis). – abarnert

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

En python 3 utilice en su lugar 'print (" Something happened: {} ". Format (e))'. – amicitas

12

Considere usar el módulo de registro de Python, esto es le dará una gran cantidad de la funcionalidad para registrar los problemas, para su posterior inspección. A continuación se muestra un ejemplo sencillo de utilizar el módulo de registro para registrar a 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") 

Mediante el uso de la función logging.exception dentro de un manejador de excepciones como se hace aquí la información de excepción se añade automáticamente al mensaje de registro.

4

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() 
6

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

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

Exception en realidad no manejan todos excepciones, sólo todas las excepciones que por lo general se desea capturar. En particular, en 2.5 y posteriores:

Todas las excepciones integradas que no 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 de salir del sistema incorporadas, como un KeyboardInterrupt del usuario golpear ^C (2.5 y posteriores)
  • excepciones definidas por el usuario que don 't siga que 'debería'

muy de vez en cuando, usted quiere manejar las cosas como KeyboardInterrupt, en cuyo caso se utiliza en lugar de BaseExceptionException.(Ver Exception hierarchy para obtener una lista de las cuales son excepciones y no son Exception subclases.) Por lo tanto:

try: 
    # stuff 
except BaseException as e: 
    print e 

Y (por lo general temporalmente durante la depuración) a veces usted realmente quiere 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 manera de manejar todas esas posibilidades es usar un desnudo except y luego usar sys.exc_info (y, opcionalmente, volver a raise nada que no desea manejar):

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

Como nota al margen, me Estoy usando la sintaxis de estilo nuevo except (except Exception as e) arriba. Esto funciona en 2.6 y posteriores, incluyendo 3.x. La sintaxis antigua (except Exception, e) está obsoleta en 2.6 y deja de funcionar en 3.0, pero si desea trabajar con versiones 2.x anteriores, debe usarla.

Cuestiones relacionadas