Python FastAPI如何创建全局异常处理器避免未捕获异常导致应用崩溃
问题原因
你看到的uvicorn层错误日志,大概率是以下两个原因导致的:
- 你的全局异常处理器处理完成后,没有正确返回符合格式的响应对象,或是处理器内部逻辑存在隐性错误、二次抛出了新异常,这部分漏网的异常会被uvicorn捕获打印
- 你当前使用的FastAPI/Starlette版本过旧,存在路由层全局异常处理器覆盖不全的已知问题,部分ASGI链路异常无法被
@app.exception_handler捕获
解决方案
按优先级逐步排查修改即可:
- 首先检查全局异常处理器逻辑,确保全程没有二次抛出异常,且最终返回标准的
JSONResponse,示例参考如下:
from fastapi import Request from fastapi.responses import JSONResponse @app.exception_handler(Exception) async def general_exception_handler(request: Request, exc: Exception): # 此处写你的自定义日志记录、请求信息保存逻辑 # 注意:此处禁止再次raise异常,所有内部调用的逻辑也要做好异常捕获 return JSONResponse( status_code=500, content={"code": 500, "msg": f"服务器内部错误:{str(exc)}"} )
- 若上述修改后仍然有报错,可以新增ASGI中间件做兜底捕获,覆盖所有链路的异常,彻底避免异常抛到uvicorn层:
from starlette.middleware.base import BaseHTTPMiddleware from starlette.responses import JSONResponse class GlobalExceptionMiddleware(BaseHTTPMiddleware): async def dispatch(self, request, call_next): try: return await call_next(request) except Exception as e: # 此处可补充你的日志、请求信息保存逻辑 return JSONResponse( status_code=500, content={"code": 500, "msg": "服务器内部错误"} ) # 将中间件注册到应用上 app.add_middleware(GlobalExceptionMiddleware)
- 如果还是存在异常漏出的情况,可以升级FastAPI和uvicorn到最新稳定版,规避版本bug:
pip install --upgrade fastapi uvicorn
完成上述修改后所有异常都会在应用层被消化,不会再抛到uvicorn层,应用也可以持续正常运行。
内容的提问来源于stack exchange,提问作者Richard Haven
相关产品推荐
相关产品推荐

