Gor*_*ley 29 python exception-handling exception traceback
以下片段:
import traceback
def a():
b()
def b():
try:
c()
except:
traceback.print_exc()
def c():
assert False
a()
Run Code Online (Sandbox Code Playgroud)
生成此输出:
Traceback (most recent call last):
File "test.py", line 8, in b
c()
File "test.py", line 13, in c
assert False
AssertionError
Run Code Online (Sandbox Code Playgroud)
如果我想要完整的堆栈跟踪包括对一个?的调用,我应该使用什么?
如果重要的话我有Python 2.6.6
编辑:我想得到的是,如果我离开尝试除外,我将得到的相同信息,并将异常传播到顶层.这个代码段例如:
def a():
b()
def b():
c()
def c():
assert False
a()
Run Code Online (Sandbox Code Playgroud)
生成此输出:
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
Run Code Online (Sandbox Code Playgroud)
Tob*_*ler 21
这是基于这个答案的功能.当没有例外时它也会起作用:
def full_stack():
import traceback, sys
exc = sys.exc_info()[0]
stack = traceback.extract_stack()[:-1] # last one would be full_stack()
if exc is not None: # i.e. 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 exc is not None:
stackstr += ' ' + traceback.format_exc().lstrip(trc)
return stackstr
Run Code Online (Sandbox Code Playgroud)
print full_stack()
将打印完整的堆栈跟踪到顶部,包括例如IPython的interactiveshell.py
调用,因为(据我所知)无法知道谁将捕获异常.无论如何,这可能不值得搞清楚......
如果print full_stack()
从一个except
块中调用,full_stack
将包括向下的堆栈跟踪raise
.在标准的Python解释器中,这与未捕获异常时收到的消息相同(这就是为什么del stack[-1]
会出现这种情况,您不关心except
块而是关于try
块).
小智 20
我不知道是否有更好的方法,但这就是我的所作所为:
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()
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出:
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
Run Code Online (Sandbox Code Playgroud)
小智 7
使用
traceback.print_stack()
Run Code Online (Sandbox Code Playgroud)
http://docs.python.org/library/traceback.html#traceback.print_stack
Run Code Online (Sandbox Code Playgroud)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()
小智 6
这是Tobias Kienzler 答案
的一个更好的变体。它的工作原理相同,但不能在except
块中正确调用,而是在更深的地方调用。换句话说,当像这样调用时,这个变体将打印相同的堆栈
try:
...
except Exception:
print full_stack()
Run Code Online (Sandbox Code Playgroud)
或者
def print_full_stack():
print full_stack()
try:
...
except Exception:
print_full_stack()
Run Code Online (Sandbox Code Playgroud)
这是代码:
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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
20186 次 |
最近记录: |