2011-05-26 5 views
12

Desde entonces he encontrado un trabajo alternativo, pero aún quiero saber la respuesta.¿Por qué no puedo recortar un Traceback de un error en Python?

+3

Luego debe explicar qué es exactamente lo que está tratando de hacer. Puede convertir su traceback en una cadena utilizando traceback.format_exec(). Las cadenas son eminentemente pickleable. – dusktreader

+0

No me quejo necesariamente, pero me interesa saber por qué se votó negativamente. Fuera de 1) falta de investigación, 2) poco claro, o 3) no útil, supongo que elegiría (1) si tuviera que hacerlo, pero ¿eso significa que debería enumerar todos los resultados de Google y los libros que * no incluyeron? * contiene la respuesta que estaba buscando? – Trindaz

+0

@Trindaz No he votado negativamente, pero si tuviera que adivinar la procedencia de los tres -1s, diría que se debió a la falta de detalles en su pregunta. ¿Por qué estás tratando de recuperar un rastreo? ¿Cuál fue el trabajo que encontraste? –

Respuesta

16

El rastreo contiene referencias a los marcos de pila de cada función/método que se invocó en el hilo actual, desde el marco superior hasta el punto donde se produjo el error. Cada marco de pila también contiene referencias a las variables locales y globales vigentes en el momento en que se llamó a cada función de la pila.

Dado que no hay forma de que pickle sepa qué serializar y qué ignorar, si pudiera encuadrar un rastreo, terminaría decapando una instantánea en movimiento de todo el estado de la aplicación: mientras se ejecuta pickle, otros hilos puede estar modificando los valores de las variables compartidas.

Una solución es crear un objeto seleccionable para recorrer el rastreo y extraer solo la información que necesita guardar.

+1

Gracias por la respuesta súper clara ... tiene sentido. Mi sueño de enviar LogRecord de forma transparente a través de la red se ha roto, pero ahora entiendo por qué no se puede hacer ... –

0

supongo que está interesado en ahorrar el contexto de la llamada completa (rastreo + globales + lugareños de cada cuadro).

Eso sería muy útil para determinar una diferencia de comportamiento de la misma función en dos contextos de llamada diferentes, o para construir sus propias herramientas avanzadas para procesar, mostrar o comparar esos registros.

El problema es que Pickl no sabe cómo serializar todo tipo de objetos que podrían estar en los locales o globals.

Supongo que puede construir su propio objeto y guardarlo, filtrando todos los objetos que no son picklabe. Este código puede servir como base:

import sys, traceback 

def print_exc_plus(): 
    """ 
    Print the usual traceback information, followed by a listing of all the 
    local variables in each frame. 
    """ 
    tb = sys.exc_info()[2] 
    while 1: 
     if not tb.tb_next: 
      break 
     tb = tb.tb_next 
    stack = [] 
    f = tb.tb_frame 
    while f: 
     stack.append(f) 
     f = f.f_back 
    stack.reverse() 
    traceback.print_exc() 
    print "Locals by frame, innermost last" 
    for frame in stack: 
     print 
     print "Frame %s in %s at line %s" % (frame.f_code.co_name, 
              frame.f_code.co_filename, 
              frame.f_lineno) 
     for key, value in frame.f_locals.items(): 
      print "\t%20s = " % key, 
      #We have to be careful not to cause a new error in our error 
      #printer! Calling str() on an unknown object could cause an 
      #error we don't want. 
      try:     
       print value 
      except: 
       print "<ERROR WHILE PRINTING VALUE>" 

pero en lugar de la impresión de los objetos que se pueden añadir a una lista con su propia representación pickable (un JSON o yml formato podría ser mejor).

Quizás desee cargar todo este contexto de llamada para reproducir la misma situación para su función sin ejecutar el complicado flujo de trabajo que la genera. No sé si esto se puede hacer (debido a las referencias de memoria), pero en ese caso necesitaría deserializarlo de su formato.

+0

Más aquí: http://code.activestate.com/recipes/52215-get-more-information- from-tracebacks / – yucer

Cuestiones relacionadas