CodeGym /课程 /Python SELF ZH /Stack Trace

Stack Trace

Python SELF ZH
第 17 级 , 课程 4
可用

5.1 模块 traceback

Stack Trace (traceback) —— 是显示导致异常发生的函数调用顺序的信息。它是调试的重要工具,因为它帮助开发者理解错误发生的地方和原因。

分析 stack trace (traceback) —— 是程序调试的重要部分,它帮助开发者理解错误发生的地方和原因。Python 提供了 模块 traceback,包含用于处理 stack traces 的函数。这个模块可以用来提取、格式化和输出 stack trace 信息。

获取和使用 stack trace

要处理 stack trace,需要引入模块 traceback,这个模块提供了用于格式化和输出 stack trace 信息的函数。

获取和输出 stack trace 的示例:


import traceback

def function_c():
    return 1 / 0  # 这会导致 ZeroDivisionError
            
def function_b():
    function_c()
            
def function_a():
    try:
        function_b()
    except ZeroDivisionError as e:
        print("发生了异常:")
        traceback.print_exc()  # 打印 stack trace
            
function_a()

输出:


发生了异常:
Traceback (most recent call last):
    File "example.py", line 12, in function_a
      function_b()
    File "example.py", line 8, in function_b
      function_c()
    File "example.py", line 4, in function_c
      return 1 / 0
ZeroDivisionError: division by zero

函数 traceback.print_exc()

这个函数打印当前异常的 stack trace 到标准错误流。

示例:


try:
    1 / 0
except ZeroDivisionError:
    traceback.print_exc()

函数 traceback.format_exc()

这个函数返回当前异常的格式化 stack trace 字符串。


try:
    1 / 0
except ZeroDivisionError:
    error_message = traceback.format_exc()
    print("获取的 stack trace 作为字符串:")
    print(error_message)    

函数 traceback.extract_tb(tb)

这个函数从可以通过 sys.exc_info() 获取的 stack trace 对象 (traceback object) 中提取 "原始" stack trace 信息。返回 stack 帧的列表。

5.2 处理和分析 stack trace

函数 traceback.format_tb(tb)

这个函数返回表示 stack trace 的格式化字符串列表。


import sys
import traceback

def function_c():
    return 1 / 0  # 这会导致 ZeroDivisionError
            
def function_b():
    function_c()
            
def function_a():
    try:
        function_b()
    except ZeroDivisionError:
        tb = sys.exc_info()[2]
        formatted_tb = traceback.format_tb(tb)
        print("格式化的 stack trace:")
        for line in formatted_tb:
            print(line, end="")
            
function_a()

函数 traceback.format_exception(exc_type, exc_value, exc_tb)

这个函数返回表示异常和 stack trace 的完整格式化字符串列表。


import sys
import traceback

def function_c():
    return 1 / 0  # 这会导致 ZeroDivisionError
            
def function_b():
    function_c()
            
def function_a():
    try:
        function_b()
    except ZeroDivisionError as e:
        exc_type, exc_value, exc_tb = sys.exc_info()
        full_tb = traceback.format_exception(exc_type, exc_value, exc_tb)
        print("完整格式化的 stack trace:")
        for line in full_tb:
            print(line, end="")
            
function_a()

有时逐帧分析 stack trace 以获得异常发生位置和该位置上下文的具体信息是有用的。


import traceback
import sys

def function_c():
    return 1 / 0  # 这会导致 ZeroDivisionError
            
def function_b():
    function_c()
            
def function_a():
    try:
        function_b()
    except ZeroDivisionError:
        tb = sys.exc_info()[2]
        for frame in traceback.extract_tb(tb):
            print(f"文件: {frame.filename}")
            print(f"行: {frame.lineno}")
            print(f"函数名: {frame.name}")
            print(f"代码: {frame.line}")
            print("-" * 40)
            
function_a()

5.3 使用 traceback 进行日志记录

有时保存 stack trace 信息在日志文件中以供后续分析是很重要的。这可以使用 模块 traceback 的函数和标准 模块 logging 来完成。

示例:


import logging
import traceback
import sys

logging.basicConfig(filename='error.log', level=logging.ERROR)
            
def function_c():
    return 1 / 0  # 这会导致 ZeroDivisionError
            
def function_b():
    function_c()
            
def function_a():
    try:
        function_b()
    except ZeroDivisionError as e:
        exc_type, exc_value, exc_tb = sys.exc_info()
        full_tb = traceback.format_exception(exc_type, exc_value, exc_tb)
        logging.error("发生了异常:\n%s", ''.join(full_tb))
            
function_a()

我们稍后会详细讨论日志记录,不过我相信这些信息对你有帮助。

1
调查/小测验
错误和异常第 17 级,课程 4
不可用
错误和异常
错误和异常
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION