2011-11-23 11 views
66

Desidero salvare il nome dell'errore e i dettagli di traceback in una variabile. Ecco il mio tentativo.Come salvare i valori di traceback/sys.exc_info() in una variabile?

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] 

uscita:

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

output desiderato:

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

P.S. So che questo può essere fatto facilmente usando il modulo di traceback, ma voglio sapere l'uso dell'oggetto sys.exc_info() [2] qui.

+2

Potreste aver capito male quello che sta succedendo nel vostro programma: ciò che si fa riferimento a come "sys.exc_info() [2] oggetto" è un'istanza dell'oggetto traceback (= si utilizza già il modulo traceback). Ora, puoi manipolare quell'oggetto senza usare le funzioni di aiuto nel modulo traceback, ma questo non cambia il fatto che lo stai ancora usando. :) – mac

+0

Hai provato a stampare sys.exc_info() [x] .__ str __()? – zmbq

+1

Quindi @mac, per favore aiutatemi ad accedere al valore da questo oggetto con o senza l'uso della funzione helper. – codersofthedark

risposta

96

Questo è come lo faccio:

>>> 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' 

Tuttavia, è necessario dare un'occhiata al traceback documentation, come si potrebbe trovare lì i metodi più adatti, a seconda di come si desidera elaborare la variabile dopo ...

+1

Stavo cercando un metodo senza utilizzare il modulo traceback. In qualche modo possiamo solo stampare i dettagli di tracciamento da questo riferimento a un oggetto? sys.exc_info() [2] – codersofthedark

+0

Giusto, è per questo che ho pensato che possiamo fare qualcosa come sys.exc_info() [2] .format_exc(), ma questo non funziona .. Quindi, mi chiedo come posso estrarre valore da oggetto trace-back sys.exc_info() [2]. Qualche idea? – codersofthedark

+0

@dragosrsupercool - "è per questo che ho pensato che possiamo fare qualcosa come sys.exc_info() [2] .format_exc()" che non ha senso. Stai provando a richiamare una funzione del modulo di traceback come se fosse un metodo dell'oggetto traceback ... – mac

1

Il mio answer a un'altra domanda può aiutare a illustrare i dettagli - con collegamenti! Per le stringhe in scatola, il modulo di traceback della libreria standard sembra a posto. Se si desidera ottenere i dettagli, leggere la fonte (<python install path>/Lib/traceback.py) per maggiori informazioni.

12

Utilizzare traceback.extract_stack() se si desidera accedere facilmente ai nomi dei moduli e delle funzioni e ai numeri di riga.

Utilizzare ''.join(traceback.format_stack()) se si desidera solo una stringa simile all'uscita traceback.print_stack().

Si noti che anche con ''.join() si otterrà una stringa multilinea, poiché gli elementi di format_stack() contengono \n. Vedi l'output qui sotto.

Ricordarsi di import traceback.

Ecco l'output da traceback.extract_stack(). Formattazione aggiunta per la leggibilità.

>>> 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) 
] 

Ecco l'output da ''.join(traceback.format_stack()). Formattazione aggiunta per la leggibilità.

>>> ''.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' 
10

sys.exc_info() restituisce una tupla con tre valori (tipo, valore, traceback).

  1. Qui tipo ottiene il tipo di eccezione che si sta gestendo valore
  2. è argomenti che vengono passati al costruttore della classe eccezione
  3. traceback contiene le informazioni di stack come dove si è verificato l'eccezione etc.

Per esempio, nel seguente programma

try: 

    a = 1/0 

except Exception,e: 

    exc_tuple = sys.exc_info() 

Ora Se stampiamo la tupla i valori saranno questo.

  1. exc_tuple [0] valore sarà "ZeroDivisionError"
  2. exc_tuple [1] valore sarà "divisione intera o modulo per zero" (stringa passata come parametro alla classe eccezione)
  3. exc_tuple [2] valore sarà "oggetto trackback a (qualche indirizzo di memoria)"

Quanto sopra può essere anche prelevato semplicemente prin l'eccezione nel formato stringa.

print str(e) 
Problemi correlati