2015-06-09 6 views
5

voglio generare una stringa di una riga da un Exception che mi dice cosa accaduto dove (non hanno bisogno di un backtrace completo). Le seguenti informazioni sarebbe bello:modo corretto per ottenere bella stringa dal eccezione

  • nome del file/LineNumber
  • tipo di eccezione
  • descrizione eccezione (quello che si ottiene da str(e))
  • bello avere: la funzione/metodo/classe

Attualmente faccio quanto segue:

import os 
... 
try: 
    os.nonexisting() 
except Exception as e: 
    t = e.__traceback__ 
    tbf = e.__traceback__.tb_frame 
    print('%s:%d: %s in %s(): "%s" ' % 
     os.path.basename(tbf.f_code.co_filename), 
     t.tb_lineno, 
     e.__class__.__name__, 
     tbf.f_code.co_name, e)) 

che mi dà:

foo.py:203: AttributeError in foo(): "'module' object has no attribute 'nonexisting'" 

Esiste un modo più elegante per stampare le indicazioni riportate in questo esempio? Sto pensando a s.th. come

print(e.format('%f: %l: %t %F: "%w"')) 

Vorrei evitare di importare moduli aggiuntivi, tranne ce ne è uno esattamente per questo scopo.

risposta

4

Penso che traceback.format_exception_only fa esattamente quello che vuoi.

try: 
    os.nonexisting() 
except Exception as e: 
    print(traceback.format_exception_only(e.__class__, e)) 
+0

Produce '[ "AttributeError: oggetto 'modulo' non ha alcun attributo 'inesistente' \ n"]' non è questo che vuole OP (dove è il nome del file, il numero di riga, la funzione/metodo di nome?). – jfs

+0

In effetti il ​​problema è aggiungere le informazioni sul numero di file/linea a 'format_exception()' senza manipolare le parti interne di 'sys.exc_info()', 'extract_tb', ecc. – frans