2012-04-11 9 views
9

Sono confuso circa la differenza tra due oggetti:`inspect.trace()` `vs traceback`

  • l'elenco dei telai restituiti da inspect.trace() mentre un'eccezione viene gestita
  • traceback restituito da sys.exc_info()[2] (o passato nella chiamata a sys.excepthook)

fare i due oggetti contengono le stesse informazioni, basta organizzati in una diversa struttura di dati? Se no, che cosa ha che l'altro no?

+0

Perché non ** testarlo ** sollevando e rilevando un'eccezione e visualizzando i risultati di ciascuno? –

+0

Ho provato, ma non si stampano (solo ) .. Quindi non sono riuscito a capire come eseguire questo test. – max

+0

Hai pensato di usare 'dir()' sui risultati? o 'help()'? –

risposta

7

Dalla documentazione di inspect.trace:

ispezionare. trace ([contesto])

restituirà un elenco di frame record per lo stack tra il frame corrente e la cornice in cui un'eccezione attualmente gestita è stata sollevata nella prima voce dell'elenco rappresenta il chiamante.; l'ultima voce rappresenta dove è stata sollevata l'eccezione.

che suggerisce che essa fornisce un bel modo per Tagliate a dadi e che fa da cornice da sys.exc_info()[2] si ottiene.

Il che, se si guarda alla fonte:

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

(identico per 3.2 o 2.7), è esattamente ciò che fa, ma passa attraverso getinnerframes, che annota con alcune informazioni utili, per la docstring:

ottenere un elenco di record per fotogramma di un traceback e tutti i fotogrammi inferiori.

Ogni record contiene un oggetto frame, nome file, numero riga, nome funzione , un elenco di righe di contesto e indice nel contesto.

E, dato che io sono curioso di sapere che cosa in realtà 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()) 

Il che, quando viene chiamato dal prompt, ricordando che molti di quei campi e gli oggetti hanno easy-to-find definizioni:

>>> syser() 
<frame object at 0x1441240> 
6 
10 
<traceback object at 0x13eb3b0> 
>>> inspecter() 
[(<frame object at 0x14a5590>, 
    '/tmp/errors.py', 
    22, 
    'inspecter', 
    None, 
    None), 
(<frame object at 0x14a21b0>, 
    '/tmp/errors.py', 
    8, 
    'errorer', 
    None, 
    None)] 

(numeri di riga saltato in giro perché ho pasticciato con formattazione)

inspect.trace() è ovviamente un po 'più bello.

Problemi correlati