Pregunta ¿Cómo guardar los valores de traceback / sys.exc_info () en una variable?


Quiero guardar el nombre del error y los detalles de seguimiento en una variable. Aquí está mi intento.

import sys
try:
    try:
        print x
    except Exception, ex:
        raise NameError
except Exception, er:
    print "0", sys.exc_info()[0]
    print "1", sys.exc_info()[1]
    print "2", sys.exc_info()[2]

Salida:

0 <type 'exceptions.NameError'>
1 
2 <traceback object at 0xbd5fc8>

Salida deseada:

0 NameError
1
2 Traceback (most recent call last):
  File "exception.py", line 6, in <module>
    raise NameError

PD Sé que esto se puede hacer fácilmente usando el módulo de rastreo, pero quiero saber aquí el uso del objeto sys.exc_info () [2].


74
2017-11-23 07:00


origen


Respuestas:


Así es como lo hago:

>>> import traceback
>>> try:
...   int('k')
... except:
...   var = traceback.format_exc()
... 
>>> print var
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError: invalid literal for int() with base 10: 'k'

Sin embargo, debe echar un vistazo a la documentación de rastreo, ya que puede encontrar métodos más adecuados, dependiendo de cómo quiera procesar su variable después ...


107
2017-11-23 07:25



sys.exc_info () devuelve una tupla con tres valores (tipo, valor, rastreo).

  1. Aquí el tipo obtiene el tipo de excepción de la excepción que se maneja
  2. valor es los argumentos que se pasan al constructor de la clase de excepción 
  3. traceback contiene la información de la pila como donde ocurrió la excepción, etc.

Por ejemplo, en el siguiente programa

try:

    a = 1/0

except Exception,e:

    exc_tuple = sys.exc_info()

Ahora si imprimimos la tupla, los valores serán esto.

  1. El valor exc_tuple [0] será "ZeroDivisionError"
  2. El valor exc_tuple [1] será "división entera o módulo por cero"(Cadena pasada como parámetro a la clase de excepción)
  3. El valor exc_tuple [2] será "objeto de retroceso en (alguna dirección de memoria)"

Los detalles anteriores también se pueden obtener simplemente imprimiendo la excepción en formato de cadena.

print str(e)

14
2018-06-06 21:22



Utilizar traceback.extract_stack() si desea un acceso conveniente a los nombres de módulos y funciones y números de línea.

Utilizar ''.join(traceback.format_stack()) si solo quieres una cadena que se parece a la traceback.print_stack() salida.

Tenga en cuenta que incluso con ''.join() obtendrá una cadena de varias líneas, ya que los elementos de format_stack() Contiene \n. Ver salida a continuación.

Recuerda import traceback.

Aquí está la salida de traceback.extract_stack(). Formateo agregado para legibilidad.

>>> traceback.extract_stack()
[
   ('<string>', 1, '<module>', None),
   ('C:\\Python\\lib\\idlelib\\run.py', 126, 'main', 'ret = method(*args, **kwargs)'),
   ('C:\\Python\\lib\\idlelib\\run.py', 353, 'runcode', 'exec(code, self.locals)'),
   ('<pyshell#1>', 1, '<module>', None)
]

Aquí está la salida de ''.join(traceback.format_stack()). Formateo agregado para legibilidad.

>>> ''.join(traceback.format_stack())
'  File "<string>", line 1, in <module>\n
   File "C:\\Python\\lib\\idlelib\\run.py", line 126, in main\n
       ret = method(*args, **kwargs)\n
   File "C:\\Python\\lib\\idlelib\\run.py", line 353, in runcode\n
       exec(code, self.locals)\n  File "<pyshell#2>", line 1, in <module>\n'

13
2017-08-08 20:51



Mi responder a otra pregunta puede ayudar a ilustrar los detalles, ¡con enlaces! Para cadenas enlatadas, el módulo de rastreo de biblioteca estándar parece estar bien. Si desea obtener los detalles, lea la fuente (<python install path>/Lib/traceback.py) para más información.


1
2018-04-16 21:14