"""错误处理和日志记录模块""" import logging import traceback from typing import Optional, Any from datetime import datetime from functools import wraps # 配置日志 logger = logging.getLogger("sqxp") logger.setLevel(logging.INFO) # 创建控制台处理器 console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) # 创建格式化器 formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) console_handler.setFormatter(formatter) # 添加处理器 if not logger.handlers: logger.addHandler(console_handler) class BusinessException(Exception): """业务异常基类""" def __init__(self, code: int = 400, message: str = "业务处理异常", data: Any = None): self.code = code self.message = message self.data = data super().__init__(message) class ValidationException(BusinessException): """数据验证异常""" def __init__(self, message: str = "数据验证失败", data: Any = None): super().__init__(code=400, message=message, data=data) class PermissionException(BusinessException): """权限不足异常""" def __init__(self, message: str = "权限不足", data: Any = None): super().__init__(code=403, message=message, data=data) class ResourceNotFoundException(BusinessException): """资源不存在异常""" def __init__(self, resource: str = "资源", data: Any = None): super().__init__(code=404, message=f"{resource}不存在", data=data) class ResourceConflictException(BusinessException): """资源冲突异常(如重复创建)""" def __init__(self, message: str = "资源已存在", data: Any = None): super().__init__(code=409, message=message, data=data) class OrderLockedException(BusinessException): """订单已锁定异常""" def __init__(self, message: str = "订单已被锁定", data: Any = None): super().__init__(code=423, message=message, data=data) class InvalidStatusTransitionException(BusinessException): """无效状态转换异常""" def __init__(self, message: str = "无效的状态转换", data: Any = None): super().__init__(code=400, message=message, data=data) def log_operation(module: str, operation: str): """操作日志装饰器""" def decorator(func): @wraps(func) def wrapper(*args, **kwargs): start_time = datetime.now() user_id = kwargs.get('current_user', {}).get('user_id') if kwargs.get('current_user') else 'anonymous' logger.info(f"[{module}] 用户 {user_id} 开始执行 {operation}") try: result = func(*args, **kwargs) elapsed = (datetime.now() - start_time).total_seconds() logger.info(f"[{module}] 用户 {user_id} 执行 {operation} 成功,耗时 {elapsed:.2f}s") return result except BusinessException as e: elapsed = (datetime.now() - start_time).total_seconds() logger.warning(f"[{module}] 用户 {user_id} 执行 {operation} 业务异常: {e.message},耗时 {elapsed:.2f}s") raise except Exception as e: elapsed = (datetime.now() - start_time).total_seconds() logger.error(f"[{module}] 用户 {user_id} 执行 {operation} 系统异常: {str(e)},耗时 {elapsed:.2f}s") logger.error(f"[{module}] 异常详情: {traceback.format_exc()}") raise return wrapper return decorator def log_api_request(endpoint: str): """API请求日志装饰器""" def decorator(func): @wraps(func) async def wrapper(*args, **kwargs): start_time = datetime.now() logger.info(f"[API] 请求开始: {endpoint}") try: result = await func(*args, **kwargs) elapsed = (datetime.now() - start_time).total_seconds() logger.info(f"[API] 请求完成: {endpoint},耗时 {elapsed:.3f}s") return result except Exception as e: elapsed = (datetime.now() - start_time).total_seconds() logger.error(f"[API] 请求异常: {endpoint},耗时 {elapsed:.3f}s,错误: {str(e)}") raise return wrapper return decorator def log_order_operation(operation: str): """订单操作日志装饰器""" return log_operation("订单管理", operation) def log_delivery_operation(operation: str): """配送操作日志装饰器""" return log_operation("配送管理", operation) def log_settlement_operation(operation: str): """结算操作日志装饰器""" return log_operation("结算管理", operation) def log_user_operation(operation: str): """用户操作日志装饰器""" return log_operation("用户管理", operation)