Python案例如何打印异常堆栈?

wen python案例 11

本文目录导读:

Python案例如何打印异常堆栈?

  1. 使用 traceback 模块(推荐)
  2. 使用 sys 模块
  3. 使用 logging 模块(生产环境推荐)
  4. 打印自定义级别的堆栈
  5. 获取格式化后的堆栈字符串
  6. 同时打印异常信息和堆栈
  7. 实际应用示例
  8. 输出示例
  9. 最佳实践建议

在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

最佳实践建议

  1. 开发环境:使用 traceback.print_exc() 快速调试
  2. 生产环境:使用 logging.exception() 记录到日志文件
  3. 异常处理:尽量捕获特定异常类型,而不是所有异常
  4. 性能考虑:异常处理有性能开销,不要过度使用

选择合适的打印方式取决于你的具体需求和使用场景。

抱歉,评论功能暂时关闭!