You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI中间件自定义异常处理器失效,返回500内部服务器错误

问题解决:FastAPI BaseHTTPMiddleware中自定义异常无法返回预期JSON响应

问题原因

BaseHTTPMiddleware属于Starlette底层中间件,运行在FastAPI请求处理管道的前置环节。在dispatch方法中直接抛出的异常,不会被FastAPI通过add_exception_handler注册的全局异常处理器捕获,而是会被Starlette默认错误处理机制接管,最终返回INTERNAL SERVER ERROR(500状态码)。

解决方案

方案一:中间件内直接返回错误响应

修改中间件逻辑,不抛出异常,直接构造符合要求的JSON响应返回:

from starlette.responses import JSONResponse

class ValueCheckMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request, call_next):
        value = request.headers.get("X-Value")
        if value != "1":
            return JSONResponse(
                status_code=400,
                content={"detail": "Value is not one"}
            )
        response = await call_next(request)
        return response

方案二:改用FastAPI依赖项实现(推荐)

依赖项是FastAPI原生设计机制,抛出的异常会被全局异常处理器正确捕获,更符合框架规范:

  1. 定义检查依赖
from fastapi import Depends, Header
from exceptions import CustomException

async def check_x_value(x_value: str = Header(...)):
    if x_value != "1":
        raise CustomException()
  1. 全局或路由级别应用依赖
# 全局应用:所有路由都会执行X-Value检查
app = FastAPI(dependencies=[Depends(check_x_value)])

# 或单个路由应用:仅指定路由执行检查
@app.get("/", dependencies=[Depends(check_x_value)])
async def read_root():
    return {"message": "Hello World"}

此方式下,原有的custom_exception_handler会正常工作,返回预期的400状态码JSON响应。

内容的提问来源于stack exchange,提问作者Ayush Katiyar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:58:11