当前位置: 首页 > news >正文

FastAPI自定义异常处理:优雅转换Pydantic校验错误

FastAPI自定义异常处理:优雅转换Pydantic校验错误

背景需求

当使用FastAPI开发API服务时,Pydantic的自动校验异常默认会返回如下格式的422响应:

{"detail": [{"type": "missing","loc": ["body", "user", "name"],"msg": "Field required","input": null}]
}

但在实际开发中我们通常需要:

  1. 统一异常响应格式
  2. 增加自定义错误码
  3. 对敏感信息进行过滤
  4. 支持多语言错误提示

实现方案

步骤1:创建自定义异常类

from fastapi import HTTPExceptionclass APIException(HTTPException):def __init__(self,code: int = 40000,message: str = "请求参数错误",status_code: int = 400,**kwargs):super().__init__(status_code=status_code,detail={"code": code,"message": message,"data": kwargs.get("data", None)})

步骤2:捕获Pydantic校验异常

2.1 异常捕获机制原理

2.1.1 FastAPI的异常处理链
# FastAPI的异常处理流程示意图
客户端请求 -> 路由函数 -> 中间件处理 -> 参数校验 -> 业务逻辑 -> 返回响应↑异常捕获点               ↑校验异常触发点异常处理器介入 ←─ 异常抛出
  • 捕获时机:当请求参数不符合Pydantic模型定义时,框架会自动抛出RequestValidationError(HTTP 422错误)
  • 处理器注册:通过@app.exception_handler装饰器绑定特定异常类型到处理函数
2.1.2 关键异常类型区分
异常类型触发场景继承关系
ValidationError手动调用模型验证时抛出Pydantic原生异常
RequestValidationErrorFastAPI自动参数校验失败继承自ValidationError

2.2 核心处理逻辑剖析

2.2.1 错误数据结构解构
# 原始错误条目结构示例
{"type": "value_error",       # 错误大类"loc": ("body", "age"),      # 错误位置元组"msg": "输入值不是合法整数",   # 原始错误描述"input": "eighteen"          # 客户端原始输入
}

字段深度说明

  • loc定位器:

    • 遵循(位置类型, 字段路径...)结构
    • 位置类型可能为:body, query, path, header, cookie
    • 嵌套字段示例:("body", "user", "address", "city")
  • 常见错误类型:

    # Pydantic预定义错误类型参考
    "missing"            # 必填字段缺失
    "value_error"        # 值校验失败
    "type_error"         # 类型不匹配
    "assertion_error"    # 自定义校验断言失败
    
2.2.2 错误信息处理流程
def 
http://www.xdnf.cn/news/534673.html

相关文章:

  • 【占融数科-注册/登录安全分析报告】
  • python里的\和/有什么区别
  • 汇编:电子计数器
  • SCT2A10一款4.5V-85V 0.6A 高效率同步可调频率的降压DCDC转换器
  • Kubernetes高阶使用指南:深入探索容器编排的艺术
  • 基于大模型的手术全流程智能决策支持系统大纲
  • 关于systemverilog中在task中使用force语句的注意事项
  • 核保核赔的集中管理方案
  • GO语言学习(五)
  • 【C/C++】C++并发编程:std::async与std::thread深度对比
  • GPFS故障实际生产故障处理分析
  • 告诉我,pavucontrol的用法,我连接耳机的时候,输入设备应该使用什么呢?
  • AI神经网络降噪 vs 传统单/双麦克风降噪的核心优势对比
  • Ktransformers0.3框架的api访问接口程序
  • vue2.0 组件生命周期
  • LLaMA-Factory:了解webUI参数
  • Mysql 刷题 day06
  • Image and depth from a conventional camera with a coded aperture论文阅读
  • “保证医疗器械信息来源合法 真实、安全的保障措施、情况说明及相关证明”模板
  • 滑动窗口算法详解:从理论到实战(LeetCode 3 438)
  • 自动化测试的框架有哪些?原理是什么?
  • 深入掌握MyBatis:连接池、动态SQL、多表查询与缓存
  • springboot+mybatis或mybatisplus在进行%name%的前后模糊查询时如何放防止sql注入
  • 汇川MD810-20M4110GXXX变频器为什么要加GRJ9000S电源滤波器?
  • C# 深入理解类(属性)
  • python打卡day30
  • Navicat连接开启sm3认证的瀚高数据库
  • 网络请求和状态管理
  • SAP学习笔记 - 开发13 - CAP 之 添加数据库支持(Sqlite)
  • 《虚实共生:双向映射重塑具身智能决策逻辑》