150 lines
5.0 KiB
Python
150 lines
5.0 KiB
Python
|
# -*- 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
|
|||
|
}
|
|||
|
),
|
|||
|
)
|