aicheckv2-api/core/exception.py

150 lines
5.0 KiB
Python
Raw Normal View History

2025-04-11 08:54:28 +08:00
# -*- coding: utf-8 -*-
# @version : 1.0
# @Create Time : 2021/10/19 15:47
# @File : exception.py
# @IDE : PyCharm
# @desc : 全局异常处理
from fastapi.responses import JSONResponse
from starlette.exceptions import HTTPException as StarletteHTTPException
from fastapi.exceptions import RequestValidationError
from starlette import status
from fastapi import Request
from fastapi.encoders import jsonable_encoder
from fastapi import FastAPI
from core.logger import logger
from application.settings import DEBUG
class CustomException(Exception):
def __init__(
self,
msg: str,
code: int = status.HTTP_400_BAD_REQUEST,
status_code: int = status.HTTP_200_OK,
desc: str = None
):
self.msg = msg
self.code = code
self.status_code = status_code
self.desc = desc
def register_exception(app: FastAPI):
"""
异常捕捉
"""
@app.exception_handler(CustomException)
async def custom_exception_handler(request: Request, exc: CustomException):
"""
自定义异常
"""
if DEBUG:
print("请求地址", request.url.__str__())
print("捕捉到重写CustomException异常异常custom_exception_handler")
print(exc.desc)
print(exc.msg)
# 打印栈信息,方便追踪排查异常
logger.exception(exc)
return JSONResponse(
status_code=exc.status_code,
content={"message": exc.msg, "code": exc.code},
)
@app.exception_handler(StarletteHTTPException)
async def unicorn_exception_handler(request: Request, exc: StarletteHTTPException):
"""
重写HTTPException异常处理器
"""
if DEBUG:
print("请求地址", request.url.__str__())
print("捕捉到重写HTTPException异常异常unicorn_exception_handler")
print(exc.detail)
# 打印栈信息,方便追踪排查异常
logger.exception(exc)
return JSONResponse(
status_code=exc.status_code,
content={
"code": exc.status_code,
"message": exc.detail,
}
)
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
"""
重写请求验证异常处理器
"""
if DEBUG:
print("请求地址", request.url.__str__())
print("捕捉到重写请求验证异常异常validation_exception_handler")
print(exc.errors())
# 打印栈信息,方便追踪排查异常
logger.exception(exc)
msg = exc.errors()[0].get("msg")
if msg == "field required":
msg = "请求失败,缺少必填项!"
elif msg == "value is not a valid list":
print(exc.errors())
msg = f"类型错误,提交参数应该为列表!"
elif msg == "value is not a valid int":
msg = f"类型错误,提交参数应该为整数!"
elif msg == "value could not be parsed to a boolean":
msg = f"类型错误,提交参数应该为布尔值!"
elif msg == "Input should be a valid list":
msg = f"类型错误,输入应该是一个有效的列表!"
return JSONResponse(
status_code=200,
content=jsonable_encoder(
{
"message": msg,
"body": exc.body,
"code": status.HTTP_400_BAD_REQUEST
}
),
)
@app.exception_handler(ValueError)
async def value_exception_handler(request: Request, exc: ValueError):
"""
捕获值异常
"""
if DEBUG:
print("请求地址", request.url.__str__())
print("捕捉到值异常value_exception_handler")
print(exc.__str__())
# 打印栈信息,方便追踪排查异常
logger.exception(exc)
return JSONResponse(
status_code=200,
content=jsonable_encoder(
{
"message": exc.__str__(),
"code": status.HTTP_400_BAD_REQUEST
}
),
)
@app.exception_handler(Exception)
async def all_exception_handler(request: Request, exc: Exception):
"""
捕获全部异常
"""
if DEBUG:
print("请求地址", request.url.__str__())
print("捕捉到全局异常all_exception_handler")
print(exc.__str__())
# 打印栈信息,方便追踪排查异常
logger.exception(exc)
return JSONResponse(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
content=jsonable_encoder(
{
"message": "接口异常!",
"code": status.HTTP_500_INTERNAL_SERVER_ERROR
}
),
)