¿Cómo registrar la excepción de Python?

¿Cómo puedo registrar una excepción en Python?

He visto algunas opciones y descubrí que puedo acceder a los detalles de la excepción real utilizando este código:

import sys import traceback try: 1/0 except: exc_type, exc_value, exc_traceback = sys.exc_info() traceback.print_exception(exc_type, exc_value, exc_traceback) 

Me gustaría obtener de alguna manera la cadena print_exception() la print_exception() para poder registrarla.

Para responder a su pregunta, puede obtener la versión de cadena de print_exception() usando la función print_exception() . Devuelve el mensaje de rastreo como una lista de cadenas en lugar de imprimirlo en la salida estándar, para que pueda hacer lo que quiera con él. Por ejemplo:

 import sys import traceback try: asdf except NameError: exc_type, exc_value, exc_traceback = sys.exc_info() lines = traceback.format_exception(exc_type, exc_value, exc_traceback) print ''.join('!! ' + line for line in lines) # Log it or whatever here 

Esto muestra:

 !! Traceback (most recent call last): !! File "", line 2, in  !! NameError: name 'asdf' is not defined 

Sin embargo, definitivamente recomendaría usar el módulo de registro de Python estándar, como sugiere rlotun. No es lo más fácil de configurar, pero es muy personalizable.

Eche un vistazo a logging.exception ( módulo de registro de Python )

 import logging def foo(): try: some_code() except: logging.exception('') 

Esto debería encargarse automáticamente de obtener el rastreo de la excepción actual y de registrarla correctamente.

Registrar excepciones es tan simple como agregar el argumento exc_info = palabra clave verdadera a cualquier mensaje de registro, vea la entrada para Logger.debug en http://docs.python.org/2/library/logging.html .

Ejemplo:

 try: raise Exception('lala') except Exception: logging.info('blah', exc_info=True) 

salida (dependiendo, por supuesto, de su configuración de manejador de registro):

 2012-11-29 10:18:12,778 - root - INFO -  : 3 - blah Traceback (most recent call last): File "", line 1, in  try: raise Exception('lala') Exception: lala 

En Python 3.5 puede pasar una instancia de excepción en el argumento exc_info:

 import logging try: 1/0 except Exception as e: logging.error('Error at %s', 'division', exc_info=e) 

En primer lugar, considere usar un tipo de excepción adecuado en su cláusula de excepción. Luego, nombrando la excepción, puede imprimirla:

 try: 1/0 except Exception as e: print e 

Dependiendo de tu versión de Python, debes usar

 except Exception, e