traceback 模块
在 Python 中traceback 模块用于提取、格式化和打印异常的回溯信息即错误发生时的调用堆栈。它可以帮助你在日志中记录错误细节或在程序中以字符串形式获取完整的错误信息。常用函数函数 说明traceback.print_exc() 直接将当前异常的堆栈信息打印到标准错误输出或指定文件traceback.format_exc() 返回当前异常的堆栈信息字符串可被记录或打印traceback.print_exception() 更灵活地打印异常需传入异常对象traceback.extract_tb() 从回溯对象中提取堆栈条目常用于解析逐帧信息traceback.format_tb() 将提取的堆栈条目格式化为字符串列表典型用法1. 捕获异常并打印堆栈pythonimport tracebacktry:1 / 0except ZeroDivisionError:traceback.print_exc() # 自动输出到 stderr2. 获取异常信息字符串用于日志pythonimport tracebacktry:open(nonexist.txt)except FileNotFoundError:err_msg traceback.format_exc()print(错误详情:, err_msg) # 实际可写入日志文件3. 结合 sys.exc_info() 手动控制pythonimport sys, tracebacktry:[1,2,3][5]except IndexError:exc_type, exc_value, exc_tb sys.exc_info()print(异常类型:, exc_type.__name__)print(异常值:, exc_value)# 获取堆栈帧信息stack_summary traceback.extract_tb(exc_tb)print(堆栈摘要:, stack_summary)4. 仅获取最后几层堆栈限制深度pythontry:recursive_func() # 假设递归过深except RecursionError:limited_tb traceback.format_exc(limit3) # 只显示最近3层print(limited_tb)注意事项· traceback.format_exc() 在没有异常时返回 None通常应放在 except 块内使用。· 若需要记录完整异常包括被抑制的异常链可用 ExceptionGroup 或 __cause__但 traceback 会默认展示 raise ... from ... 的关系。· 在日志记录中推荐使用 logging.exception(msg)它内部会自动调用 traceback.format_exc()。对比 traceback 与直接 print(e)· print(e) 只显示异常的消息如 division by zero· traceback.print_exc() 会显示完整的调用栈更利于调试。如果你需要更精细地控制堆栈条目比如只获取文件名、行号、函数名可以用 extract_tb()pythonimport tracebacktry:raise ValueError(demo)except ValueError:tb_list traceback.extract_tb(sys.exc_info()[2])for frame in tb_list:print(f{frame.filename}:{frame.lineno} in {frame.name} - {frame.line})这样就能清晰定位到每个调用帧。