Source (Py v2.7.3) per traceback.format_exception() e chiamata/funzioni relative aiuta notevolmente. In modo imbarazzante, mi dimentico sempre di Read the Source. L'ho fatto solo per questo dopo aver cercato invano dettagli simili. Una semplice domanda, "Come ricreare lo stesso risultato di Python per un'eccezione, con tutti gli stessi dettagli?" Ciò porterebbe chiunque al 90% in più a qualsiasi cosa stiano cercando. Frustrato, ho trovato questo esempio. Spero che aiuti gli altri. (E 'sicuro che mi ha aiutato ;-)
import sys, traceback
traceback_template = '''Traceback (most recent call last):
File "%(filename)s", line %(lineno)s, in %(name)s
%(type)s: %(message)s\n''' # Skipping the "actual line" item
# Also note: we don't walk all the way through the frame stack in this example
# see hg.python.org/cpython/file/8dffb76faacc/Lib/traceback.py#l280
# (Imagine if the 1/0, below, were replaced by a call to test() which did 1/0.)
try:
1/0
except:
# http://docs.python.org/2/library/sys.html#sys.exc_info
exc_type, exc_value, exc_traceback = sys.exc_info() # most recent (if any) by default
'''
Reason this _can_ be bad: If an (unhandled) exception happens AFTER this,
or if we do not delete the labels on (not much) older versions of Py, the
reference we created can linger.
traceback.format_exc/print_exc do this very thing, BUT note this creates a
temp scope within the function.
'''
traceback_details = {
'filename': exc_traceback.tb_frame.f_code.co_filename,
'lineno' : exc_traceback.tb_lineno,
'name' : exc_traceback.tb_frame.f_code.co_name,
'type' : exc_type.__name__,
'message' : exc_value.message, # or see traceback._some_str()
}
del(exc_type, exc_value, exc_traceback) # So we don't leave our local labels/objects dangling
# This still isn't "completely safe", though!
# "Best (recommended) practice: replace all exc_type, exc_value, exc_traceback
# with sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]
print
print traceback.format_exc()
print
print traceback_template % traceback_details
print
In risposta specifica a questa domanda:
sys.exc_info()[0].__name__, os.path.basename(sys.exc_info()[2].tb_frame.f_code.co_filename), sys.exc_info()[2].tb_lineno
Utilizzare il modulo built-in [traceback] (http://docs.python.org/library/traceback.html). –
Potrebbe anche essere utile stampare la riga di codice, dove si è verificata un'eccezione: consultare http://stackoverflow.com/questions/14519177/python-exception-handling-line-number/20264059#20264059 – Apogentus