`inspect.trace ()` vs `traceback`

Estoy confundido acerca de la diferencia entre dos objetos:

  • la lista de marcos devueltos por inspect.trace() mientras se maneja una excepción
  • el rastreo devuelto por sys.exc_info()[2] (o pasado en la llamada a sys.excepthook )

¿Los dos objetos contienen la misma información, simplemente organizada en una estructura de datos diferente? Si no, ¿qué tiene uno que no tiene el otro?

De la documentación de inspect.trace:

inspeccionar. traza ([contexto])

Devuelva una lista de registros de cuadros para la stack entre el cuadro actual y el cuadro en el que se generó una excepción que se está manejando actualmente. La primera entrada en la lista representa a la persona que llama; la última entrada representa donde se levantó la excepción.

lo que sugiere que proporciona una buena manera de sys.exc_info()[2] cuadros de sys.exc_info()[2] que obtienes.

Que, si nos fijamos en la fuente:

 def trace(context=1): """Return a list of records for the stack below the current exception.""" return getinnerframes(sys.exc_info()[2], context) 

(idéntico para 3.2 o 2.7 ), es exactamente lo que hace, pero lo pasa a través de getinnerframes , que lo anota con alguna información útil, según la cadena de documentación:

Obtenga una lista de registros para el marco de un rastreo y todos los marcos inferiores.

Cada registro contiene un objeto de marco, nombre de archivo, número de línea, nombre de la función, una lista de líneas de contexto e índice dentro del contexto.

Y, ya que tengo curiosidad por lo que realmente significa:

 import sys import inspect from pprint import pprint def errorer(): raise Exception('foo') def syser(): try: errorer() except Exception, e: tb = sys.exc_info()[2] print tb.tb_frame print tb.tb_lasti print tb.tb_lineno print tb.tb_next def inspecter(): try: errorer() except Exception, e: pprint(inspect.trace()) 

Que, cuando se llama desde el indicador, al tiempo que recuerda que muchos de esos campos y objetos tienen definiciones fáciles de encontrar :

 >>> syser()  6 10  >>> inspecter() [(, '/tmp/errors.py', 22, 'inspecter', None, None), (, '/tmp/errors.py', 8, 'errorer', None, None)] 

(Los números de línea saltaron porque me metí con el formato)

inspect.trace() es obviamente un poco más agradable.