exceptions.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. """统一业务异常:抛出后由全局 handler 转成固定 JSON。"""
  2. from __future__ import annotations
  3. class AppError(Exception):
  4. """可预期异常基类。"""
  5. def __init__(
  6. self,
  7. message: str,
  8. *,
  9. code: str = "APP_ERROR",
  10. status_code: int = 400,
  11. ) -> None:
  12. self.message = message
  13. self.code = code
  14. self.status_code = status_code
  15. super().__init__(message)
  16. class BadRequestError(AppError):
  17. def __init__(self, message: str = "请求参数错误") -> None:
  18. super().__init__(message, code="BAD_REQUEST", status_code=400)
  19. class NotFoundError(AppError):
  20. def __init__(self, message: str = "资源不存在") -> None:
  21. super().__init__(message, code="NOT_FOUND", status_code=404)
  22. class ExternalServiceError(AppError):
  23. def __init__(self, message: str = "外部服务调用失败", *, status_code: int = 502) -> None:
  24. super().__init__(message, code="EXTERNAL_SERVICE", status_code=status_code)
  25. class MovieServiceError(ExternalServiceError):
  26. """TMDB / MovieService 相关错误。"""
  27. def __init__(self, message: str, *, status_code: int = 502) -> None:
  28. super().__init__(message, status_code=status_code)
  29. self.code = "TMDB_ERROR"