Python调试时异常附带更多信息吗

wen python案例 2

本文目录导读:

Python调试时异常附带更多信息吗

  1. 使用自定义异常类
  2. 使用异常链
  3. 使用 traceback 模块获取详细堆栈
  4. 添加上下文信息
  5. 使用 logging 模块记录详细信息
  6. 使用 sys.exc_info() 获取异常信息
  7. 第三方库:rich 提供更美观的异常信息
  8. 实际应用示例

是的,Python调试时异常可以附带更多信息,以下是几种常见的方法:

使用自定义异常类

class CustomError(Exception):
    def __init__(self, message, code=None, data=None):
        super().__init__(message)
        self.code = code
        self.data = data
# 使用
try:
    raise CustomError("操作失败", code=400, data={"field": "name"})
except CustomError as e:
    print(f"错误信息: {e}")
    print(f"错误代码: {e.code}")
    print(f"附加数据: {e.data}")

使用异常链

try:
    # 一些操作
    result = 1 / 0
except ZeroDivisionError as e:
    raise RuntimeError("计算失败") from e

使用 traceback 模块获取详细堆栈

import traceback
try:
    # 可能出错的代码
    raise ValueError("自定义错误")
except:
    # 获取完整堆栈信息
    traceback.print_exc()
    # 或获取字符串形式
    error_info = traceback.format_exc()
    print(error_info)

添加上下文信息

import sys
def process_data(data):
    try:
        # 数据处理
        result = data['key1'] / data['key2']
        return result
    except Exception as e:
        # 添加额外上下文信息
        raise RuntimeError(f"处理数据时出错: {data}") from e
try:
    process_data({"key1": 10, "key2": 0})
except Exception as e:
    print(f"异常: {e}")
    print(f"原始异常: {e.__cause__}")

使用 logging 模块记录详细信息

import logging
logging.basicConfig(level=logging.DEBUG)
try:
    value = int("abc")
except ValueError as e:
    logging.error("转换失败", exc_info=True)  # 记录完整堆栈
    logging.debug(f"输入值: 'abc'")  # 记录额外信息

使用 sys.exc_info() 获取异常信息

import sys
try:
    1/0
except:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    print(f"异常类型: {exc_type}")
    print(f"异常值: {exc_value}")
    print(f"堆栈跟踪: {exc_traceback}")

第三方库:rich 提供更美观的异常信息

from rich.console import Console
from rich.traceback import install
install()  # 安装rich的异常处理器
console = Console()
# 当异常发生时,会自动显示更详细的格式化信息

实际应用示例

class DatabaseError(Exception):
    def __init__(self, message, query=None, params=None, original_error=None):
        self.query = query
        self.params = params
        self.original_error = original_error
        super().__init__(message)
def execute_query(sql, params=None):
    try:
        # 模拟数据库操作
        raise ConnectionError("数据库连接失败")
    except ConnectionError as e:
        raise DatabaseError(
            "数据库查询失败",
            query=sql,
            params=params,
            original_error=e
        )
try:
    execute_query("SELECT * FROM users WHERE id = %s", [1])
except DatabaseError as e:
    print(f"错误: {e}")
    print(f"SQL: {e.query}")
    print(f"参数: {e.params}")
    print(f"原始错误: {e.original_error}")

这些方法可以帮助你获取更详细的异常信息,便于调试和问题定位。

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