Kaip gauti pilną išimčių kamino pėdsaką „Python“

Šis fragmentas:

 import traceback def a(): b() def b(): try: c() except: traceback.print_exc() def c(): assert False a() 

Pateikia šią išvestį:

 Traceback (most recent call last): File "test.py", line 8, in b c() File "test.py", line 13, in c assert False AssertionError 

Ką turėčiau naudoti, jei noriu, kad visas sklypas būtų įtrauktas į skambutį?

Jei tai svarbu, turiu Python 2.6.6

redaguoti: norėčiau gauti tą pačią informaciją, kurią galėčiau gauti, jei išeinu iš bandymo, išskyrus išimtį, ir leiskite, kad išimtis būtų taikoma aukščiausiam lygiui. Šis fragmentas, pavyzdžiui:

 def a(): b() def b(): c() def c(): assert False a() 

Pateikia šią išvestį:

 Traceback (most recent call last): File "test.py", line 10, in <module> a() File "test.py", line 2, in a b() File "test.py", line 5, in b c() File "test.py", line 8, in c assert False AssertionError 
27
22 мая '11 в 12:05 2011-05-22 12:05 Gordon Wrigley paklausė 22 gegužės 11 d. 12:05 2011-05-22 12:05
@ 4 atsakymai

Nežinau, ar yra geresnis būdas, bet ką aš padariau:

 import traceback import sys def format_exception(e): exception_list = traceback.format_stack() exception_list = exception_list[:-2] exception_list.extend(traceback.format_tb(sys.exc_info()[2])) exception_list.extend(traceback.format_exception_only(sys.exc_info()[0], sys.exc_info()[1])) exception_str = "Traceback (most recent call last):\n" exception_str += "".join(exception_list) # Removing the last \n exception_str = exception_str[:-1] return exception_str def main1(): main2() def main2(): try: main3() except Exception as e: print "Printing only the traceback above the current stack frame" print "".join(traceback.format_exception(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2])) print print "Printing the full traceback as if we had not caught it here..." print format_exception(e) def main3(): raise Exception() if __name__ == '__main__': main1() 

Ir čia yra rezultatas:

 Printing only the traceback above the current stack frame Traceback (most recent call last): File "exc.py", line 22, in main2 main3() File "exc.py", line 31, in main3 raise Exception() Exception Printing the full traceback as if we had not caught it here... Traceback (most recent call last): File "exc.py", line 34, in <module> main1() File "exc.py", line 18, in main1 main2() File "exc.py", line 22, in main2 main3() File "exc.py", line 31, in main3 raise Exception() Exception 
19
22 сент. John Wernicke atsakymas rugsėjo 22 d 2012-09-22 02:21 '12, 02:21 am 2012-09-22 02:21

Čia yra funkcija, pagrįsta šiuo atsakymu . Jis taip pat veiks, jei nėra jokios išimties:

 def full_stack(): import traceback, sys exc = sys.exc_info()[0] stack = traceback.extract_stack()[:-1] # last one would be full_stack() if not exc is None: # ie if an exception is present del stack[-1] # remove call of full_stack, the printed exception # will contain the caught exception caller instead trc = 'Traceback (most recent call last):\n' stackstr = trc + ''.join(traceback.format_list(stack)) if not exc is None: stackstr += ' ' + traceback.format_exc().lstrip(trc) return stackstr 

print full_stack() išspausdins visą print full_stack() pėdsaką į viršų, įskaitant, pavyzdžiui, IPython interactiveshell.py skambučius, nes, kiek žinau, nėra jokio būdo žinoti, kas bus išimtis. Tikriausiai nieko verta sužinoti ...

Jei print full_stack() yra iškviečiamas, except bloką, full_stack turės raise pėdsaką, kurį norite raise . Standartiniame „Python“ vertėjo kalboje tai bus identiška pranešimui, kurį gausite, kai nepriimsite išimties (todėl yra del stack[-1] , jums nereikia except bloko, bet try bloko).

19
16 мая '13 в 17:04 2013-05-16 17:04 atsakymas pateiktas Tobias Kienzleriui gegužės 13 d., 17:04 2013-05-16 17:04

Naudojimas

  traceback.print_stack() 

http://docs.python.org/library/traceback.html#traceback.print_stack

 suxmac2 $ python out.py File "out.py", line 16, in <module> a() File "out.py", line 5, in a b() File "out.py", line 11, in b traceback.print_stack() 
7
22 мая '11 в 12:16 2011-05-22 12:16 Atsakymą davė Andreas Jung gegužės 22 d. 11 val. 12:16 2011-05-22 12:16


Štai šiek tiek geresnis atsakymas Tobiasui Kienzleriui . Jis veikia taip pat, bet jis gali būti vadinamas neteisingu, except bloką, bet kažkur giliau. Kitaip tariant, ši parinktis išspausdins tuos pačius kaminus, kai jie bus vadinami

 try: ... except Exception: print full_stack() 

arba

 def print_full_stack(): print full_stack() try: ... except Exception: print_full_stack() 

Čia yra kodas:

 def full_stack(): import traceback, sys exc = sys.exc_info()[0] if exc is not None: f = sys.exc_info()[-1].tb_frame.f_back stack = traceback.extract_stack(f) else: stack = traceback.extract_stack()[:-1] # last one would be full_stack() trc = 'Traceback (most recent call last):\n' stackstr = trc + ''.join(traceback.format_list(stack)) if exc is not None: stackstr += ' ' + traceback.format_exc().lstrip(trc) return stackstr 
1
12 нояб. atsakymas pateikiamas Skipor 12 nov. 2017-11-12 12:14 '17 at 12:14 2017-11-12 12:14

Žr. Kitus klausimus apie „ žymes, arba užduoti klausimą