前言

在Python开发中,异常处理常被视为初级主题,但真正优秀的异常处理策略往往体现了开发者对系统可靠性的深刻理解。本文不讨论基础的try/except语法,而是聚焦于生产环境中异常处理的进阶实践,探讨如何构建具有容错性、可观测性的健壮系统。


一、异常处理三原则

1. 语义化异常捕获

避免宽泛的Exception捕获,但也不要过度细分。建议按照业务逻辑分层捕获:

class DataValidationError(Exception):
pass

def process_data(data):
try:
validate(data) # 可能抛出DataValidationError
transform(data) # 可能抛出ValueError
except DataValidationError as e:
logger.error(f"业务校验失败: {e}")
raise APIValidationError from e
except ValueError as e:
logger.error(f"数据转换异常: {e}")
raise ServiceUnavailableError("数据处理服务不可用") from e

上下文保留

使用raise from保持异常链,但要注意信息过滤:

try:
conn = create_db_connection()
except ConnectionError as e:
logger.error("数据库连接失败")
# 保留原始异常但转换业务语义
raise ServiceInitializationError("系统初始化失败") from e

资源安全边界

推荐使用上下文管理器管理资源生命周期:

1. 自定义上下文管理器类

class Transaction:
def __enter__(self):
self.conn = create_connection()
return self.conn.cursor()

def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type is None:
self.conn.commit()
else:
self.conn.rollback()
self.conn.close()

with Transaction() as cursor:
cursor.execute("UPDATE accounts SET balance = ...")

2. [进阶技巧]contextlib 工具库

from contextlib import contextmanager

@contextmanager
def timer():
start = time.time()
try:
yield # 在此处分割 __enter__ 和 __exit__
finally:
print(f"耗时:{time.time() - start:.2f}s")

# 使用
with timer():
time.sleep(1)