fix: 重写异常处理逻辑代码

This commit is contained in:
chenwj 2023-01-16 16:41:06 +08:00
parent cc6faebddc
commit 722488be7b
1 changed files with 34 additions and 23 deletions

View File

@ -1,9 +1,12 @@
import logging
from fastapi import Request, status from fastapi import Request, status
from fastapi.exceptions import HTTPException, RequestValidationError from fastapi.exceptions import HTTPException, RequestValidationError
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse
from src.dtos import BaseResponse, ErrorModel from src.dtos import BaseResponse, ErrorModel
logger = logging.getLogger("uvicorn.error")
class HttpCodeMsg: class HttpCodeMsg:
REGISTER_USER_ALREADY_EXISTS = "REGISTER_USER_ALREADY_EXISTS" REGISTER_USER_ALREADY_EXISTS = "REGISTER_USER_ALREADY_EXISTS"
@ -24,30 +27,38 @@ class HttpCodeMsg:
HTTP_503 = "SERVICE_UNAVAILABLE" HTTP_503 = "SERVICE_UNAVAILABLE"
HTTP_504 = "GATEWAY_TIMEOUT" HTTP_504 = "GATEWAY_TIMEOUT"
def request_validation_error_handler(req: Request, exc: RequestValidationError):
def request_validation_error_handler(request: Request, exc: RequestValidationError): """
请求响应校验错误处理
:param req:
:param exc:
:return:
"""
errors = exc.errors() errors = exc.errors()
print(errors) logger.error(f"{req.method} {req.url} , errors: {errors}")
details = [] response_errors = [error for error in errors if error["loc"][0] == "response"]
for error in errors: if len(response_errors) > 0:
err_type = error["type"].split(".") message = "接口响应异常 "
if len(err_type) == 2:
if err_type[0] == "value_error":
if err_type[1] == "missing":
if len(error["loc"]) == 2:
msg = f"{error['loc'][0]}: '{error['loc'][1]}' is required!"
else: else:
msg = "value is missing!" message = "接口请求异常 "
else: json_err = [err["msg"] for err in errors if "value_error.jsondecode" == err["type"]]
msg = error["msg"].replace("this value", f"'{error['loc'][1]}' value") if json_err:
else: message += "请求参数JSON编码有误;"
msg = error["msg"] value_err = [err["msg"] for err in errors if "value_error" == err["type"]]
details.append(msg) if value_err:
else: message += "; ".join(value_err)
details.append(error["msg"]) missing_err = [err["loc"][-1] for err in errors if "value_error.missing" == err["type"]]
err = dict(code=status.HTTP_400_BAD_REQUEST, messages=HttpCodeMsg.HTTP_400, details="; ".join(details)) if missing_err:
message += "缺少字段:{} ".format(", ".join(missing_err))
type_err = [err["msg"].replace("value", f"{err['loc'][1]}") for err in errors if "type_error" == err["type"]]
if type_err:
message += "; ".join(type_err)
not_none_err = [err["loc"][-1] for err in errors if "type_error.none.not_allowed" == err["type"]]
if not_none_err:
message += "字段:{} 不能为空".format(", ".join(not_none_err))
err = dict(code=status.HTTP_400_BAD_REQUEST, message=message, details=message)
res = BaseResponse(**dict(result=None, error=err)) res = BaseResponse(**dict(result=None, error=err))
return JSONResponse(status_code=status.HTTP_400_BAD_REQUEST, content=res.dict()) return JSONResponse(status_code=200, content=res.dict())
def http_exception_handler(request: Request, exc: HTTPException): def http_exception_handler(request: Request, exc: HTTPException):