本文目录导读:

在Python中打印异常堆栈有多种方法,下面详细介绍几种常用方式:
使用 traceback 模块(推荐)
import traceback
try:
# 模拟一个异常
result = 1 / 0
except Exception as e:
print("异常信息:", e)
print("异常堆栈:")
traceback.print_exc() # 打印完整堆栈
也可以获取堆栈字符串:
import traceback
try:
result = 1 / 0
except Exception as e:
# 获取堆栈字符串
stack_trace = traceback.format_exc()
print("完整堆栈:")
print(stack_trace)
使用 sys 模块
import sys
try:
result = 1 / 0
except Exception as e:
print("异常信息:", e)
# 打印异常详细信息
sys.excepthook(*sys.exc_info())
使用 logging 模块(生产环境推荐)
import logging
# 配置日志
logging.basicConfig(level=logging.ERROR,
format='%(asctime)s - %(levelname)s - %(message)s')
try:
result = 1 / 0
except Exception as e:
# 自动打印异常堆栈
logging.exception("发生错误")
打印自定义级别的堆栈
import traceback
def print_custom_stack():
"""打印指定层数的堆栈"""
try:
result = 1 / 0
except Exception as e:
# 只打印最后5行堆栈
traceback.print_exc(limit=5)
print_custom_stack()
获取格式化后的堆栈字符串
import traceback
try:
result = 1 / 0
except Exception as e:
# 获取格式化的堆栈列表
stack_list = traceback.format_exc().split('\n')
print("堆栈行数:", len(stack_list))
print("\n堆栈内容:")
for line in stack_list:
print(line)
同时打印异常信息和堆栈
import traceback
try:
with open('nonexistent_file.txt', 'r') as f:
content = f.read()
except FileNotFoundError as e:
print(f"异常类型: {type(e).__name__}")
print(f"异常信息: {e}")
print("异常堆栈:")
traceback.print_exc()
print("\n--- 堆栈字符串 ---")
print(traceback.format_exc())
实际应用示例
import traceback
import logging
def risky_function(value):
"""可能引发异常的函数"""
if value == 0:
raise ValueError("值不能为0")
return 100 / value
def safe_function(value):
"""安全调用函数并记录异常"""
try:
result = risky_function(value)
return result
except Exception as e:
# 记录完整异常信息
print(f"函数调用失败: {e}")
print("完整堆栈跟踪:")
traceback.print_exc()
# 保存到日志文件
logging.basicConfig(filename='error.log', level=logging.ERROR)
logging.exception(f"处理值 {value} 时出错")
return None
# 测试
print(safe_function(10)) # 正常
print(safe_function(0)) # 异常
输出示例
异常信息: division by zero
异常堆栈:
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
ZeroDivisionError: division by zero
最佳实践建议
- 开发环境:使用
traceback.print_exc()快速调试 - 生产环境:使用
logging.exception()记录到日志文件 - 异常处理:尽量捕获特定异常类型,而不是所有异常
- 性能考虑:异常处理有性能开销,不要过度使用
选择合适的打印方式取决于你的具体需求和使用场景。