33from fastapi import FastAPI , Request
44from fastapi .exceptions import RequestValidationError
55from pydantic import ValidationError
6- from pydantic .errors import PydanticUserError
76from starlette .exceptions import HTTPException
87from starlette .middleware .cors import CORSMiddleware
98from uvicorn .protocols .http .h11_impl import STATUS_PHRASES
1211from backend .common .response .response_code import CustomResponseCode , StandardResponseCode
1312from backend .common .response .response_schema import response_base
1413from backend .common .schema import (
15- CUSTOM_USAGE_ERROR_MESSAGES ,
1614 CUSTOM_VALIDATION_ERROR_MESSAGES ,
1715)
1816from backend .core .conf import settings
1917from backend .utils .serializers import MsgSpecJSONResponse
2018from backend .utils .trace_id import get_request_trace_id
2119
2220
23- def _get_exception_code (status_code : int ):
21+ def _get_exception_code (status_code : int ) -> int :
2422 """
25- 获取返回状态码, OpenAPI, Uvicorn... 可用状态码基于 RFC 定义, 详细代码见下方链接
23+ 获取返回状态码( 可用状态码基于 RFC 定义)
2624
27- `python 状态码标准支持 <https://github.com/python/cpython/blob/6e3cc72afeaee2532b4327776501eb8234ac787b/Lib/http
28- /__init__.py#L7>`__
25+ `python 状态码标准支持 <https://github.com/python/cpython/blob/6e3cc72afeaee2532b4327776501eb8234ac787b/Lib/http/__init__.py#L7>`__
2926
3027 `IANA 状态码注册表 <https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml>`__
3128
32- :param status_code:
29+ :param status_code: HTTP 状态码
3330 :return:
3431 """
3532 try :
3633 STATUS_PHRASES [status_code ]
34+ return status_code
3735 except Exception :
38- code = StandardResponseCode .HTTP_400
39- else :
40- code = status_code
41- return code
36+ return StandardResponseCode .HTTP_400
4237
4338
44- async def _validation_exception_handler (request : Request , e : RequestValidationError | ValidationError ):
39+ async def _validation_exception_handler (request : Request , exc : RequestValidationError | ValidationError ):
4540 """
4641 数据验证异常处理
4742
48- :param e:
43+ :param request: 请求对象
44+ :param exc: 验证异常
4945 :return:
5046 """
5147 errors = []
52- for error in e .errors ():
48+ for error in exc .errors ():
5349 custom_message = CUSTOM_VALIDATION_ERROR_MESSAGES .get (error ['type' ])
5450 if custom_message :
5551 ctx = error .get ('ctx' )
@@ -87,10 +83,10 @@ def register_exception(app: FastAPI):
8783 @app .exception_handler (HTTPException )
8884 async def http_exception_handler (request : Request , exc : HTTPException ):
8985 """
90- 全局HTTP异常处理
86+ 全局 HTTP 异常处理
9187
92- :param request:
93- :param exc:
88+ :param request: FastAPI 请求对象
89+ :param exc: HTTP 异常
9490 :return:
9591 """
9692 if settings .ENVIRONMENT == 'dev' :
@@ -113,53 +109,32 @@ async def http_exception_handler(request: Request, exc: HTTPException):
113109 @app .exception_handler (RequestValidationError )
114110 async def fastapi_validation_exception_handler (request : Request , exc : RequestValidationError ):
115111 """
116- fastapi 数据验证异常处理
112+ FastAPI 数据验证异常处理
117113
118- :param request:
119- :param exc:
114+ :param request: FastAPI 请求对象
115+ :param exc: 验证异常
120116 :return:
121117 """
122118 return await _validation_exception_handler (request , exc )
123119
124120 @app .exception_handler (ValidationError )
125121 async def pydantic_validation_exception_handler (request : Request , exc : ValidationError ):
126122 """
127- pydantic 数据验证异常处理
123+ Pydantic 数据验证异常处理
128124
129- :param request:
130- :param exc:
125+ :param request: 请求对象
126+ :param exc: 验证异常
131127 :return:
132128 """
133129 return await _validation_exception_handler (request , exc )
134130
135- @app .exception_handler (PydanticUserError )
136- async def pydantic_user_error_handler (request : Request , exc : PydanticUserError ):
137- """
138- Pydantic 用户异常处理
139-
140- :param request:
141- :param exc:
142- :return:
143- """
144- content = {
145- 'code' : StandardResponseCode .HTTP_500 ,
146- 'msg' : CUSTOM_USAGE_ERROR_MESSAGES .get (exc .code ),
147- 'data' : None ,
148- }
149- request .state .__request_pydantic_user_error__ = content
150- content .update (trace_id = get_request_trace_id (request ))
151- return MsgSpecJSONResponse (
152- status_code = StandardResponseCode .HTTP_500 ,
153- content = content ,
154- )
155-
156131 @app .exception_handler (AssertionError )
157132 async def assertion_error_handler (request : Request , exc : AssertionError ):
158133 """
159134 断言错误处理
160135
161- :param request:
162- :param exc:
136+ :param request: FastAPI 请求对象
137+ :param exc: 断言错误
163138 :return:
164139 """
165140 if settings .ENVIRONMENT == 'dev' :
@@ -183,8 +158,8 @@ async def custom_exception_handler(request: Request, exc: BaseExceptionMixin):
183158 """
184159 全局自定义异常处理
185160
186- :param request:
187- :param exc:
161+ :param request: FastAPI 请求对象
162+ :param exc: 自定义异常
188163 :return:
189164 """
190165 content = {
@@ -205,8 +180,8 @@ async def all_unknown_exception_handler(request: Request, exc: Exception):
205180 """
206181 全局未知异常处理
207182
208- :param request:
209- :param exc:
183+ :param request: FastAPI 请求对象
184+ :param exc: 未知异常
210185 :return:
211186 """
212187 if settings .ENVIRONMENT == 'dev' :
@@ -233,10 +208,11 @@ async def cors_custom_code_500_exception_handler(request, exc):
233208 跨域自定义 500 异常处理
234209
235210 `Related issue <https://github.com/encode/starlette/issues/1175>`_
211+
236212 `Solution <https://github.com/fastapi/fastapi/discussions/7847#discussioncomment-5144709>`_
237213
238- :param request:
239- :param exc:
214+ :param request: FastAPI 请求对象
215+ :param exc: 自定义异常
240216 :return:
241217 """
242218 if isinstance (exc , BaseExceptionMixin ):
0 commit comments