| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- from fastapi import FastAPI, Request
- from fastapi.encoders import jsonable_encoder
- from fastapi.exceptions import HTTPException
- from pydantic_validation_decorator import FieldValidationError
- from starlette.responses import JSONResponse
- from core.exceptions import (
- AuthException,
- LoginException,
- ModelValidatorException,
- PermissionException,
- ServiceException,
- ServiceWarning,
- )
- from utils import ResponseUtil, logger
- def handle_exception(app: FastAPI):
- """
- 全局异常处理
- """
- # 自定义token检验异常
- @app.exception_handler(AuthException)
- async def auth_exception_handler(_: Request, exc: AuthException):
- return ResponseUtil.unauthorized(data=exc.data, msg=exc.message)
- # 自定义登录检验异常
- @app.exception_handler(LoginException)
- async def login_exception_handler(_: Request, exc: LoginException):
- return ResponseUtil.failure(msg=exc.message, data=exc.data)
- # 自定义模型检验异常
- @app.exception_handler(ModelValidatorException)
- async def model_validator_exception_handler(
- _: Request, exc: ModelValidatorException
- ):
- logger.warning(exc.message)
- return ResponseUtil.failure(msg=exc.message, data=exc.data)
- # 自定义字段检验异常
- @app.exception_handler(FieldValidationError)
- async def field_validation_error_handler(_: Request, exc: FieldValidationError):
- logger.warning(exc.message)
- return ResponseUtil.failure(msg=exc.message)
- # 自定义权限检验异常
- @app.exception_handler(PermissionException)
- async def permission_exception_handler(_: Request, exc: PermissionException):
- return ResponseUtil.forbidden(data=exc.data, msg=exc.message)
- # 自定义服务异常
- @app.exception_handler(ServiceException)
- async def service_exception_handler(_: Request, exc: ServiceException):
- logger.error(exc.message)
- return ResponseUtil.error(data=exc.data, msg=exc.message)
- # 自定义服务警告
- @app.exception_handler(ServiceWarning)
- async def service_warning_handler(_: Request, exc: ServiceWarning):
- logger.warning(exc.message)
- return ResponseUtil.failure(msg=exc.message, data=exc.data)
- # 处理其他http请求异常
- @app.exception_handler(HTTPException)
- async def http_exception_handler(_: Request, exc: HTTPException):
- return JSONResponse(
- content=jsonable_encoder({"code": exc.status_code, "msg": exc.detail}),
- status_code=exc.status_code,
- )
- # 处理其他异常
- @app.exception_handler(Exception)
- async def exception_handler(_: Request, exc: Exception):
- logger.exception(exc)
- return ResponseUtil.error(msg=str(exc))
|