今天调试代码,突然发现异常处理时不够完善,只能看到异常是什么,但是定位不到发生异常的是哪一行代码。于是,研究了一下如何获取python的调用栈。
python自带的traceback模块,可以获取调用栈。
给一段示例代码:
import sys
import traceback
try:
a=1/0
except Exception as e:
print('---- repr(e) ----')
print(repr(e))
print('---- sys.exc_info() ----')
print(repr(sys.exc_info()))
print('---- traceback.print_exc() ----')
traceback.print_exc()
print('---- traceback.format_exc() ----')
print(traceback.format_exc())
print('---- traceback.print_stack() ----')
traceback.print_stack()
运行效果如下:
E:\py>python cmd_info.py
---- repr(e) ----
ZeroDivisionError('division by zero')
---- sys.exc_info() ----
(, ZeroDivisionError('division by zero'), )
---- traceback.print_exc() ----
Traceback (most recent call last):
File "cmd_info.py", line 7, in a=1/0
ZeroDivisionError: division by zero
---- traceback.format_exc() ----
Traceback (most recent call last):
File "cmd_info.py", line 7, in a=1/0
ZeroDivisionError: division by zero
---- traceback.print_stack() ----
File "cmd_info.py", line 18, in traceback.print_stack()
sys.exc_info,traceback.print_exc,traceback.format_exc这几个都是打印异常信息,后两者里面能看到发生异常的行号。
traceback.print_stack就是专门用来获取调用栈的,它的打印信息没有行号。还有一个traceback.format_stack函数与之对应,返回一个字符串对象。
再看一个单独显示调用栈的示例:
import traceback
def t1():
traceback.print_stack()
def t2():
t1()
def t3():
t2()
t3()
运行效果如下:
E:\py>python cmd_info.py
File "cmd_info.py", line 15, in t3()
File "cmd_info.py", line 13, in t3
t2()
File "cmd_info.py", line 10, in t2
t1()
File "cmd_info.py", line 7, in t1
traceback.print_stack()
-- EOF --