当前位置: 代码网 > it编程>前端脚本>Python > Python Fastapi实现统一处理各种异常

Python Fastapi实现统一处理各种异常

2025年06月10日 Python 我要评论
在 fastapi 中处理参数校验错误(通常由 pydantic 模型或路径参数校验触发)需要使用自定义异常处理器捕获 requestvalidationerror。以下是详细实现步骤:1. 基础实现

在 fastapi 中处理参数校验错误(通常由 pydantic 模型或路径参数校验触发)需要使用自定义异常处理器捕获 requestvalidationerror。以下是详细实现步骤:

1. 基础实现(返回标准错误结构)

from fastapi import fastapi, request, status
from fastapi.exceptions import requestvalidationerror
from fastapi.responses import jsonresponse

app = fastapi()

@app.exception_handler(requestvalidationerror)
async def validation_exception_handler(request: request, exc: requestvalidationerror):
    return jsonresponse(
        status_code=status.http_422_unprocessable_entity,
        content={
            "code": 422,
            "message": "参数校验失败",
            "errors": exc.errors()
        },
    )

# 示例路由
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str):
    return {"item_id": item_id, "q": q}

2. 自定义错误格式(简化输出)

@app.exception_handler(requestvalidationerror)
async def custom_validation_handler(request: request, exc: requestvalidationerror):
    simplified_errors = []
    for error in exc.errors():
        # 提取关键信息
        simplified_errors.append({
            "field": "->".join(str(loc) for loc in error["loc"]),  # 错误字段路径
            "msg": error["msg"],
            "type": error["type"]
        })
    
    return jsonresponse(
        status_code=422,
        content={
            "error": "validationerror",
            "detail": simplified_errors
        }
    )

3. 完整示例(含路由演示)

from pydantic import basemodel, field

class item(basemodel):
    name: str = field(..., min_length=3)
    price: float = field(gt=0)

@app.post("/items/")
async def create_item(item: item):
    return item

# 测试无效请求
# curl -x post 'http://localhost:8000/items/' \
# -h 'content-type: application/json' \
# -d '{"name": "ab", "price": -1}'

4. 处理自定义错误类型(扩展)

如果需要统一处理其他错误:

from fastapi import httpexception

@app.exception_handler(httpexception)
async def http_exception_handler(request: request, exc: httpexception):
    return jsonresponse(
        status_code=exc.status_code,
        content={"error": exc.detail}
    )

关键说明

1.错误信息结构

{
  "loc": ["body", "price"],
  "msg": "ensure this value is greater than 0",
  "type": "value_error.number.not_gt"
}
  • loc:错误位置(body/query/path/header等 + 字段路径)
  • msg:人类可读错误描述
  • type:错误类型标识符

2.http 状态码

参数校验错误通常返回 422 unprocessable entity

路径参数错误(如 item_id: int 接收到字符串)会触发相同错误

3.调试信息: 生产环境中建议隐藏详细错误,可通过环境变量控制:

import os

@app.exception_handler(requestvalidationerror)
async def handler(...):
    if os.getenv("env") == "prod":
        return jsonresponse(status_code=422, content={"error": "invalid params"})
    else:
        # 返回完整错误

测试验证

使用无效参数请求示例路由,将得到类似响应:

{
  "code": 422,
  "message": "参数校验失败",
  "errors": [
    {
      "field": "body->name",
      "msg": "ensure this value has at least 3 characters",
      "type": "value_error.any_str.min_length"
    },
    {
      "field": "body->price",
      "msg": "ensure this value is greater than 0",
      "type": "value_error.number.not_gt"
    }
  ]
}

提示:fastapi 自动生成的文档(swagger ui)中的参数校验错误由内置处理器处理,自定义处理器不影响文档界面行为。

到此这篇关于python fastapi实现统一处理各种异常的文章就介绍到这了,更多相关python fastapi异常处理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com