You need to enable JavaScript to run this app. Python FastAPI如何创建全局异常处理器避免未捕获异常导致应用崩溃
优惠活动
大模型
产品
解决方案
定价
更多

Python FastAPI如何创建全局异常处理器避免未捕获异常导致应用崩溃

问题原因

你看到的uvicorn层错误日志,大概率是以下两个原因导致的:

  • 你的全局异常处理器处理完成后,没有正确返回符合格式的响应对象,或是处理器内部逻辑存在隐性错误、二次抛出了新异常,这部分漏网的异常会被uvicorn捕获打印
  • 你当前使用的FastAPI/Starlette版本过旧,存在路由层全局异常处理器覆盖不全的已知问题,部分ASGI链路异常无法被@app.exception_handler捕获
解决方案

按优先级逐步排查修改即可:

  1. 首先检查全局异常处理器逻辑,确保全程没有二次抛出异常,且最终返回标准的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)}"}
    )
  1. 若上述修改后仍然有报错,可以新增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)
  1. 如果还是存在异常漏出的情况,可以升级FastAPI和uvicorn到最新稳定版,规避版本bug:
pip install --upgrade fastapi uvicorn

完成上述修改后所有异常都会在应用层被消化,不会再抛到uvicorn层,应用也可以持续正常运行。

内容的提问来源于stack exchange,提问作者Richard Haven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 12:24:03