Python的traceback模块用于从程序运行的堆栈中提取,格式化或打印程序目前执行的上下文信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import traceback

def main():
return 2 // 0

try:
main()
except ZeroDivisionError as e:
traceback.print_exc()
# Traceback (most recent call last):
# File "D:\trainingfile\training5.py", line 7, in <module>
# main()
# File "D:\trainingfile\training5.py", line 4, in main
# return 2 // 0
# ZeroDivisionError: integer division or modulo by zero
  • traceback.print_exc()函数只是traceback.print_exception()函数的一个简写形式,
  • 它们获取异常相关的数据都是通过sys.exc_info()函数得到的。

traceback.print_exc()跟traceback.format_exc()有什么区别

  • format_exc()返回字符串,print_exc()则直接给打印出来。

  • 即traceback.print_exc()与print traceback.format_exc()效果是一样的。

  • print_exc()还可以接受file参数直接写入到一个文件。

  • 比如写入到tb.txt文件去。

    1
    traceback.print_exc(file=open('tb.txt','w+'))

traceback.print_exc() 方法打印出的信息包括3 部分:

  • 错误类型(IndexError)

  • 错误对应的值(list index out of range)

  • 具体的 trace 信息,包括文件名、具体的行号、函数名以及 对应的源代码。

Traceback 模块提供了一系列方法来获取和显示异常发生时候的trace 相关信息,下面列举几个常用的方法:

  1. traceback.print_exception(type, value, traceback[, limit[, file]])
    根据limit 的设置打印栈信息,file 为 None 的情况下定位到sys.stderr,否则则写入文件;其中type、value、 traceback 这 3 个参数对应的值可以从 sys.exc_info() 中获取。
  2. raceback.print_exc([limit[, file]])
    为print_exception() 函数的缩写,不需要传入type、 value、traceback 这 3 个参数。
  3. traceback.format_exc([limit]),与 print_exc() 类似,区别在于返回形式为字符串。
  4. traceback.extract_stack([file,[, limit]]),从当前栈帧中提取 trace 信息