当Python程序出现异常时,在控制台输出的错误信息中包含了一份称为 traceback 的调用堆栈信息。 traceback 信息记录了异常是如何在函数之间传递,以及导致错误的代码行号等详细信息。
以下是 Python traceback 的具体使用方法,分为两个方面讲解:1. 常用 traceback 模块的基本用法;2. traceback 模块的高级用法。
1. 常用 traceback 模块的基本用法
在 Python 程序中捕获到异常后,可以使用 traceback.print_exc()
或 traceback.format_exc()
方法将 traceback 信息输出到控制台或字符串中:
import traceback
try:
1/0
except Exception:
traceback.print_exc()
输出结果如下:
Traceback (most recent call last):
File "<ipython-input-2-4869a105c44e>", line 3, in <module>
1/0
ZeroDivisionError: division by zero
traceback.print_exc()
输出的 traceback 信息与在控制台中看到的一致,也可以将该信息输出到文件中:
import traceback
try:
1/0
except Exception as err:
with open('error.log', 'w') as f:
traceback.print_exc(file=f)
上面的代码将 traceback 信息输出到文件 error.log 中。
Python 还提供了 traceback.format_exc()
方法,它的用法类似于 traceback.print_exc()
,但它将 traceback 信息格式化成字符串形式:
import traceback
try:
1/0
except Exception as err:
tb_info = traceback.format_exc()
print(tb_info)
输出结果如下:
Traceback (most recent call last):
File "<ipython-input-2-4869a105c44e>", line 3, in <module>
1/0
ZeroDivisionError: division by zero
由于 traceback.format_exc()
输出的是字符串格式的 traceback 信息,因此可以将其写入日志文件中,或者通过邮件、微信、短信等方式发送给开发人员。
2. traceback 模块的高级用法
通过 traceback.extract_tb()
方法可以获取 traceback 信息的各段信息,该方法返回一个 traceback 索引的列表,每一项包含四个元素:文件名、行号、函数名以及源代码:
import traceback
def test():
a = 1 / 0
try:
test()
except Exception:
tb_list = traceback.extract_tb(sys.exc_info()[2])
for tb in tb_list:
filename, lineno, func, code = tb
print(f"文件名: {filename}\n"
f"行号: {lineno}\n"
f"函数: {func}\n"
f"代码: {code}")
上面的代码输出结果如下:
文件名: /Users/someone/Desktop/test.py
行号: 7
函数: test
代码: a = 1 / 0
另外,通过 traceback.walk_tb()
方法可以遍历 traceback 信息,该方法返回一个三元组,包含三个元素:一个帧对象、帧对象所对应的堆栈上下文以及堆栈上下文所处的层数:
import traceback
def test():
a = 1 / 0
try:
test()
except Exception:
tb_obj = traceback.TracebackException(*sys.exc_info())
for frame, filename, lineno, func, code, index in tb_obj.walk_tb():
print(f"文件名: {filename}\n"
f"行号: {lineno}\n"
f"函数: {func}\n"
f"代码: {code}")
上面的代码输出结果与上面的示例类似,但是通过 traceback.walk_tb()
方法可以获取到更多的堆栈上下文信息。
以上就是 Python traceback 的详细使用方法,希望对你有所帮助。