讲师中心 微信公众号
AI工具推荐 视频效率加速

fastapi 如何统一使用自定义异常模型作为错误响应

胖浩酱_6654

胖浩酱_6654

发布时间:2026-01-21 18:06:01

|

251人浏览过

|

来源于php中文网

原创

FastAPI可通过异常处理器与Pydantic模型统一错误响应格式为{"code":int,"message":str,"details":Any};需定义ErrorResponse模型、注册HTTPException/Exception/自定义异常处理器,并在路由中用responses参数声明OpenAPI错误结构。

fastapi 如何统一使用自定义异常模型作为错误响应

FastAPI 中可以通过异常处理器(exception handlers)和 Pydantic 模型配合,实现所有错误响应都统一返回你定义的结构化错误格式,比如 {"code": 400, "message": "xxx", "details": {...}}。

定义统一错误响应模型

先用 Pydantic 创建一个标准错误响应模型,它将作为所有异常响应的序列化格式:

from pydantic import BaseModel
from typing import Optional, Any
<p>class ErrorResponse(BaseModel):
code: int
message: str
details: Optional[Any] = None

注册全局异常处理器

使用 app.add_exception_handler() 注册对 Exception 或具体异常(如 HTTPException、自定义异常)的处理逻辑。推荐按需注册两类:

  • 处理 FastAPI 内置的 HTTPException:提取 status_code 和 detail
  • 处理未捕获的通用异常(可选):记录日志并返回 500 错误
from fastapi import FastAPI, HTTPException, Request
from fastapi.responses import JSONResponse
<p>app = FastAPI()</p><p>@app.exception_handler(HTTPException)
async def http_exception_handler(request: Request, exc: HTTPException) -> JSONResponse:
return JSONResponse(
status_code=exc.status_code,
content=ErrorResponse(
code=exc.status_code,
message=exc.detail,
details=getattr(exc, "headers", None) or getattr(exc, "data", None)
).model_dump()
)</p><p>@app.exception_handler(Exception)
async def unhandled_exception_handler(request: Request, exc: Exception) -> JSONResponse:</p><h1>生产环境建议只返回泛化错误,避免泄露敏感信息</h1><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">return JSONResponse(
    status_code=500,
    content=ErrorResponse(
        code=500,
        message="Internal server error",
        details=None
    ).model_dump()
)</code></pre>

Skill Weave Chains — 技能链路由引擎
Skill Weave Chains — 技能链路由引擎

开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。

下载

定义并抛出自定义业务异常

为不同业务场景创建继承自 Exception 的异常类,并在视图中主动 raise。这样既能保持逻辑清晰,又可被统一处理器捕获:

class ValidationError(Exception):
    def __init__(self, message: str, details: Optional[dict] = None):
        self.message = message
        self.details = details
        self.status_code = 422
<h1>在路由中使用</h1><p>@app.get("/items/{item_id}")
def get_item(item_id: int):
if item_id < 1:
raise ValidationError("Item ID must be positive", {"field": "item_id"})
return {"id": item_id}

然后为其注册专属处理器(注意注册顺序:更具体的异常要先注册):

@app.exception_handler(ValidationError)
async def validation_error_handler(request: Request, exc: ValidationError) -> JSONResponse:
    return JSONResponse(
        status_code=exc.status_code,
        content=ErrorResponse(
            code=exc.status_code,
            message=exc.message,
            details=exc.details
        ).model_dump()
    )</font><H3>让 OpenAPI 文档也反映统一错误结构</H3><p>默认情况下,FastAPI 不会自动把异常响应写入 OpenAPI schema。你可以通过 <code>responses</code> 参数显式声明,并复用 <code>ErrorResponse</code> 模型:</p><font color="gray"><pre class="brush:php;toolbar:false;"><code>@app.get(
    "/users/{user_id}",
    responses={
        404: {"model": ErrorResponse, "description": "User not found"},
        422: {"model": ErrorResponse, "description": "Validation failed"},
    }
)
def get_user(user_id: int):
    if user_id != 123:
        raise HTTPException(status_code=404, detail="User not found")
    return {"name": "Alice"}

这样 Swagger UI 就会显示对应状态码的错误响应结构,提升 API 可用性与前端协作效率。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

99

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

514

2026.02.06

Python Web框架FastAPI 全栈开发教程合集
Python Web框架FastAPI 全栈开发教程合集

以 FastAPI 为核心,讲解现代 Python Web API 的高效开发方式,涵盖路由定义与路径参数/查询参数/请求体绑定、Pydantic 模型的数据校验与序列化、依赖注入(Depends)系统的分层设计、中间件与 CORS 配置、OAuth2 + JWT 认证流程、后台任务(BackgroundTasks)、WebSocket 实时通信、SQLAlchemy 异步 ORM 集成、自动生成 OpenAPI/Swagger 交互文

476

2026.05.09

Python FastAPI异步微服务与高性能接口设计
Python FastAPI异步微服务与高性能接口设计

本专题聚焦 Python FastAPI 框架在高性能接口与微服务开发中的应用,讲解异步请求处理、依赖注入机制、路由设计、数据库异步操作以及接口性能优化策略。结合实际项目案例,帮助开发者构建高并发、低延迟的现代化后端服务架构。

399

2026.06.16

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5379

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2725

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

3348

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2425

2025.08.29

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

0

2026.09.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.6万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn