如何在 Python 中打印异常堆栈跟踪?

2025年1月5日 | 阅读 4 分钟

为了产生异常的堆栈跟踪,可疑代码将被保留在 try 块中,并在 except 块中进行处理。为了处理创建的异常,我们将在此处输出堆栈跟踪。理解问题和代码错误的来源,有助于通过发布异常的堆栈跟踪来解决。不仅如此,堆栈跟踪还会指示错误的发生位置。

错误堆栈跟踪的一般格式如下:

  • 最新实例的调用堆栈。
  • 程序的位置。
  • 程序中发生错误的行。
  • 错误名称:与异常相关的详细信息。

示例

方法 1:使用 print_exc() 方法

此函数堆叠来自 traceback 对象 (tb) 的跟踪条目,并将异常信息打印到文件中。

语法

参数:此方法接受以下参数

  • 如果 limit 参数为正数,则从 Traceback 对象 tb 打印最多 limit 个堆栈跟踪条目(从调用者帧开始)。否则,打印最后的 abs(limit) 个条目。如果 limit 参数为 None,则显示所有条目。
  • 如果 file 参数为 None,则输出将发送到 sys.stderr;否则,输出应发送到打开的文件或类文件对象。
  • 与解释器打印未处理的异常的方式类似,如果 chain 参数为 true(默认值),也会打印链式异常。

返回值:None。

代码

程序说明

使用异常处理,Python 程序演示了如何在尝试访问超出数组“A”边界的索引(5)处的元素时处理索引错误。程序尝试访问“A[5]”,如果发生异常,它会在 try 块内发送一个 traceback。使用 print_exc() 函数打印包含异常详细信息的堆栈跟踪。在此实例中,它输出了 IndexError 和相关的堆栈跟踪。即使在 try 块中处理了异常,try-except 块之后的代码也会执行,因为程序仍然运行,并且会打印消息“end of program”。

输出

Traceback (most recent call last):
  File "C:/Python27/hdg.py", line 8, in 
    value=A[5]
IndexError: list index out of range
end of program

方法 2:使用 print_exception() 方法

此函数堆叠来自 traceback 对象 (tb) 的跟踪条目,并将异常信息打印到文件中。

语法

参数:此方法接受以下参数

  • 当 tb 参数为 None 时,将打印标题 Traceback(最近一次调用)。
  • 在堆栈跟踪之后,它输出异常的 etype 和 value。
  • 如果 type(value) 参数是 SyntaxError 并且 value 格式正确,它将输出包含语法错误以及指示错误大致位置的插入符的行。
  • 假设 limit 参数为正数,则从 Traceback 对象 tb 打印最多 limit 个堆栈跟踪条目(从调用者帧开始)。否则,打印最后的 abs(limit) 个条目。如果 limit 参数为 None,则显示所有条目。
  • 如果 file 参数为 None,则输出将发送到 sys.stderr;否则,输出应发送到打开的文件或类文件对象。
  • 与解释器打印未处理的异常的方式类似,如果 chain 参数为 true(默认值),也会打印链式异常。

返回值:None。

代码

程序说明

此 Python 程序演示了如何在发生除以零的情况下处理异常。程序尝试在 try 块中执行 a / b 操作,其中“a”初始化为 4,“b”初始化为 0。由于禁止除以零,因此会引发异常。except 块捕获了异常和 Traceback。使用 print_exception(*sys.exc_info()) 函数打印堆栈跟踪,该函数还提供异常的类型、值和 Traceback。即使在 try 块中处理了异常,try-except 块之后的代码也会执行,因为程序仍然运行,并且会打印消息“end of program”。

输出

Traceback (most recent call last):
  File "C:/Python27/hdg.py", line 10, in 
    value=a/b
ZeroDivisionError: integer division or modulo by zero
end of program