文档位置

https://docs.python.org/3/library/traceback.html

traceback模块总览

traceback提供了一个标准接口来提取、格式化和打印 Python 程序的堆栈跟踪结果。它完全模仿Python 解释器在打印堆栈跟踪结果时的行为。当我们想要在程序控制下打印堆栈跟踪结果时,这是非常有用的,such as in a “wrapper” around the interpreter。

这个模块使用traceback对象(这是存储在sys.last_traceback中的对象类型变量),并作为sys.exc_info()的第三项被返回。

traceback.print_tb()

traceback.print_tb(tb, limit=None, file=None) 将traceback中的limit层堆栈信息打印到file处
参数解释:

  • tb,指代traceback对象
  • limit,要打印的堆栈层数,正数为从入口开始数,负数则从最后一层往前数,None则打印全部
  • file,指代traceback输出位置,如果为None,则输出到sys.stderr,可以传递一个打开的文件对象,或者file-like对象
1
2
3
4
5
6
7
8
import traceback
import sys

try:
    s = 1 / 0
except Exception as e:
    traceback.print_tb(sys.exc_info()[2])

输出:

1
2
  File "main.py", line 5, in <module>
    s = 1 / 0

traceback.print_exception()

traceback.print_exception(etype, value, tb, limit=None, file=None, chain=True) 打印异常信息和traceback中的堆栈信息到file中。

它和print_tb()不同的地方:

  • 如果tb不是None,则会打印Traceback (most recent call last)
  • 在堆栈信息之后打印etype和value
  • 如果type(value)的值是SyntaxError且value有适合的格式,那么它将打印发生SyntaxError的行,并带有指示错误的大致位置的插入符号

参数train如果是True,则将异常链(异常中的__cause____context__)全部打印

1
2
3
4
5
6
7
8
import traceback
import sys

try:
    s = 1 / 0
except Exception as e:
    traceback.print_exception(*sys.exc_info())

输出:

1
2
3
4
Traceback (most recent call last):
  File "main.py", line 5, in <module>
    s = 1 / 0
ZeroDivisionError: division by zero

traceback.print_exc()

traceback.print_exc(limit=None, file=None, chain=True)print_exception的速记(shorthand)

traceback.print_last()

traceback.print_last(limit=None, file=None, chain=True)等价于print_exception(sys.last_type, sys.last_value, sys.last_traceback, limit, file, chain)

traceback.print_stack()

traceback.print_stack(f=None, limit=None, file=None) 同样是打印limit层堆栈信息到file里。不同的是f参数,用于指定要启动的备用堆栈帧(stack frame)

待续