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.
Perché non ** testarlo ** sollevando e rilevando un'eccezione e visualizzando i risultati di ciascuno? –
Ho provato, ma non si stampano (solo) .. Quindi non sono riuscito a capire come eseguire questo test. –
max
Hai pensato di usare 'dir()' sui risultati? o 'help()'? –