exceptions.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. """错误处理和日志记录模块"""
  2. import logging
  3. import traceback
  4. from typing import Optional, Any
  5. from datetime import datetime
  6. from functools import wraps
  7. # 配置日志
  8. logger = logging.getLogger("sqxp")
  9. logger.setLevel(logging.INFO)
  10. # 创建控制台处理器
  11. console_handler = logging.StreamHandler()
  12. console_handler.setLevel(logging.INFO)
  13. # 创建格式化器
  14. formatter = logging.Formatter(
  15. '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
  16. datefmt='%Y-%m-%d %H:%M:%S'
  17. )
  18. console_handler.setFormatter(formatter)
  19. # 添加处理器
  20. if not logger.handlers:
  21. logger.addHandler(console_handler)
  22. class BusinessException(Exception):
  23. """业务异常基类"""
  24. def __init__(self, code: int = 400, message: str = "业务处理异常", data: Any = None):
  25. self.code = code
  26. self.message = message
  27. self.data = data
  28. super().__init__(message)
  29. class ValidationException(BusinessException):
  30. """数据验证异常"""
  31. def __init__(self, message: str = "数据验证失败", data: Any = None):
  32. super().__init__(code=400, message=message, data=data)
  33. class PermissionException(BusinessException):
  34. """权限不足异常"""
  35. def __init__(self, message: str = "权限不足", data: Any = None):
  36. super().__init__(code=403, message=message, data=data)
  37. class ResourceNotFoundException(BusinessException):
  38. """资源不存在异常"""
  39. def __init__(self, resource: str = "资源", data: Any = None):
  40. super().__init__(code=404, message=f"{resource}不存在", data=data)
  41. class ResourceConflictException(BusinessException):
  42. """资源冲突异常(如重复创建)"""
  43. def __init__(self, message: str = "资源已存在", data: Any = None):
  44. super().__init__(code=409, message=message, data=data)
  45. class OrderLockedException(BusinessException):
  46. """订单已锁定异常"""
  47. def __init__(self, message: str = "订单已被锁定", data: Any = None):
  48. super().__init__(code=423, message=message, data=data)
  49. class InvalidStatusTransitionException(BusinessException):
  50. """无效状态转换异常"""
  51. def __init__(self, message: str = "无效的状态转换", data: Any = None):
  52. super().__init__(code=400, message=message, data=data)
  53. def log_operation(module: str, operation: str):
  54. """操作日志装饰器"""
  55. def decorator(func):
  56. @wraps(func)
  57. def wrapper(*args, **kwargs):
  58. start_time = datetime.now()
  59. user_id = kwargs.get('current_user', {}).get('user_id') if kwargs.get('current_user') else 'anonymous'
  60. logger.info(f"[{module}] 用户 {user_id} 开始执行 {operation}")
  61. try:
  62. result = func(*args, **kwargs)
  63. elapsed = (datetime.now() - start_time).total_seconds()
  64. logger.info(f"[{module}] 用户 {user_id} 执行 {operation} 成功,耗时 {elapsed:.2f}s")
  65. return result
  66. except BusinessException as e:
  67. elapsed = (datetime.now() - start_time).total_seconds()
  68. logger.warning(f"[{module}] 用户 {user_id} 执行 {operation} 业务异常: {e.message},耗时 {elapsed:.2f}s")
  69. raise
  70. except Exception as e:
  71. elapsed = (datetime.now() - start_time).total_seconds()
  72. logger.error(f"[{module}] 用户 {user_id} 执行 {operation} 系统异常: {str(e)},耗时 {elapsed:.2f}s")
  73. logger.error(f"[{module}] 异常详情: {traceback.format_exc()}")
  74. raise
  75. return wrapper
  76. return decorator
  77. def log_api_request(endpoint: str):
  78. """API请求日志装饰器"""
  79. def decorator(func):
  80. @wraps(func)
  81. async def wrapper(*args, **kwargs):
  82. start_time = datetime.now()
  83. logger.info(f"[API] 请求开始: {endpoint}")
  84. try:
  85. result = await func(*args, **kwargs)
  86. elapsed = (datetime.now() - start_time).total_seconds()
  87. logger.info(f"[API] 请求完成: {endpoint},耗时 {elapsed:.3f}s")
  88. return result
  89. except Exception as e:
  90. elapsed = (datetime.now() - start_time).total_seconds()
  91. logger.error(f"[API] 请求异常: {endpoint},耗时 {elapsed:.3f}s,错误: {str(e)}")
  92. raise
  93. return wrapper
  94. return decorator
  95. def log_order_operation(operation: str):
  96. """订单操作日志装饰器"""
  97. return log_operation("订单管理", operation)
  98. def log_delivery_operation(operation: str):
  99. """配送操作日志装饰器"""
  100. return log_operation("配送管理", operation)
  101. def log_settlement_operation(operation: str):
  102. """结算操作日志装饰器"""
  103. return log_operation("结算管理", operation)
  104. def log_user_operation(operation: str):
  105. """用户操作日志装饰器"""
  106. return log_operation("用户管理", operation)