本文目录导读:

- 使用自定义异常类
- 使用异常链
- 使用
traceback模块获取详细堆栈 - 添加上下文信息
- 使用 logging 模块记录详细信息
- 使用
sys.exc_info()获取异常信息 - 第三方库:
rich提供更美观的异常信息 - 实际应用示例
是的,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}")
这些方法可以帮助你获取更详细的异常信息,便于调试和问题定位。