FastAPI:(6)錯誤處理

FastAPI:(6)錯誤處理

由于CSDN無法展示「漸構」的「#d,#e,#t,#c,#v,#a」標簽,推薦訪問我個人網站進行閱讀:Hkini
「漸構展示」如下:在這里插入圖片描述
在這里插入圖片描述

#c 概述 文章概念關系

graph TDA[錯誤處理] --> B[HTTPException]A --> C[自定義異常類]A --> D[異常處理器]D --> E[注冊處理器]E --> F[@app.exception_handler]B --> G[狀態碼]B --> H[detail]B --> I[headers]C --> J[UnicornException]D --> K[RequestValidationError]K --> L[請求體]K --> M[覆蓋默認處理器]D --> N[復用默認處理器]N --> O[fastapi.exception_handlers]

#d 錯誤處理

錯誤處理是指在應用運行過程中對可能發生的異常或錯誤進行捕獲、統一響應和返回格式化錯誤信息的機制。FastAPI 支持對內建異常(如 HTTPException)的處理,以及自定義異常類型的注冊和響應方式。良好的錯誤處理機制可以提升 API 的魯棒性、用戶體驗和調試效率。

重要特征

  • 特征1基于 HTTPException 或自定義異常類
    FastAPI 默認支持 fastapi.HTTPException,也允許定義自己的異常類和異常處理器。
  • 特征2響應內容結構化,可自定義狀態碼、消息和返回體
    錯誤響應可包括 status_codedetailheaders 等字段。
  • 特征3通過 @app.exception_handler 注冊處理器
    可針對特定異常類型定義處理邏輯,統一捕獲并生成響應。
  • 特征4與路徑操作函數邏輯解耦
    使主業務代碼更簡潔清晰,錯誤處理集中統一。

#e 訂單查詢異常處理(正例)

現象:
在一個電商平臺中,用戶根據訂單 ID 查詢訂單詳情。若訂單不存在,則拋出 HTTPException(404),返回“訂單未找到”的錯誤響應。

特征對比

特征是否滿足
使用 HTTPException 或自定義異常? 使用內建 HTTPException
響應結構規范(狀態碼、消息)? 設置 404 + detail
捕獲邏輯清晰明確? 異常直接由業務邏輯觸發
與主業務邏輯解耦? 查詢失敗即拋異常,無需后續處理判斷
from fastapi import FastAPI, HTTPExceptionapp = FastAPI()fake_orders = {"123": "訂單123內容", "456": "訂單456內容"}@app.get("/order/{order_id}")
async def get_order(order_id: str):if order_id not in fake_orders:raise HTTPException(status_code=404, detail="訂單未找到")return {"order_id": order_id, "content": fake_orders[order_id]}

HTTPException 是額外包含了和 API 有關數據的常規 Python 異常。因為是 Python 異常,所以不能 return,只能 raise

如在調用「路徑操作函數」里的工具函數時,觸發了 HTTPException,FastAPI 就不再繼續執行_路徑操作函數_中的后續代碼,而是立即終止請求,并把 HTTPException 的 HTTP 錯誤發送至客戶端。

觸發 HTTPException 時,可以用參數 detail 傳遞任何能轉換為 JSON 的值,不僅限于 str。還支持傳遞 dictlist 等數據結構。FastAPI 能自動處理這些數據,并將之轉換為 JSON。

#e return 返回錯誤信息(反例)

現象:
當用戶輸入非法請求時,系統返回如下內容:

return {"error": "invalid input"}

并未使用 HTTP 狀態碼或異常處理機制。

特征對比

特征是否滿足
使用 HTTPException 或自定義異常? 直接 return,未拋異常
響應結構標準? 未設置狀態碼,結構不規范
捕獲邏輯統一? 所有錯誤需開發者手動處理
與主業務解耦? 錯誤處理混雜在主邏輯中,易出錯

#e 自定義響應頭

有些場景下要為 HTTP 錯誤添加自定義響應頭。例如,出于某些方面的安全需要。一般情況下可能不會需要在代碼中直接使用響應頭。但對于某些高級應用場景,還是需要添加自定義響應頭:

from fastapi import FastAPI, HTTPExceptionapp = FastAPI()items = {"foo": "The Foo Wrestlers"}@app.get("/items-header/{item_id}")
async def read_item_header(item_id: str):if item_id not in items:raise HTTPException(status_code=404,detail="Item not found",headers={"X-Error": "There goes my error"}, # 添加響應頭)return {"item": items[item_id]}

#e 自定義異常處理器

添加自定義處理器,要使用 Starlette 的異常工具。假設要觸發的自定義異常叫作 UnicornException。且需要 FastAPI 實現全局處理該異常。此時,可以用 @app.exception_handler() 添加自定義異常控制器:

from fastapi import FastAPI, Request
from fastapi.responses import JSONResponseclass UnicornException(Exception):def __init__(self, name: str):self.name = nameapp = FastAPI()@app.exception_handler(UnicornException)
async def unicorn_exception_handler(request: Request, exc: UnicornException):return JSONResponse(status_code=418,content={"message": f"Oops! {exc.name} did something. There goes a rainbow..."},)@app.get("/unicorns/{name}")
async def read_unicorn(name: str):if name == "yolo":raise UnicornException(name=name)return {"unicorn_name": name}

請求 /unicorns/yolo 時,路徑操作會觸發 UnicornException
但該異常將會被 unicorn_exception_handler 處理。
接收到的錯誤信息清晰明了,HTTP 狀態碼為 418,JSON 內容如下:

{"message": "Oops! yolo did something. There goes a rainbow..."}

#e 覆蓋請求驗證異常

「請求中包含無效數據」時,FastAPI 內部會觸發 RequestValidationError。該異常也內置了默認異常處理器。

覆蓋默認異常處理器時需要導入 RequestValidationError,并用 @app.excption_handler(RequestValidationError) 裝飾異常處理器。這樣,異常處理器就可以接收 Request 與異常。

from fastapi import FastAPI, HTTPException
from fastapi.exceptions import RequestValidationError
from fastapi.responses import PlainTextResponse
from starlette.exceptions import HTTPException as StarletteHTTPExceptionapp = FastAPI()@app.exception_handler(StarletteHTTPException)
async def http_exception_handler(request, exc):return PlainTextResponse(str(exc.detail), status_code=exc.status_code)@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request, exc):return PlainTextResponse(str(exc), status_code=400)@app.get("/items/{item_id}")
async def read_item(item_id: int):if item_id == 3:raise HTTPException(status_code=418, detail="Nope! I don't like 3.")return {"item_id": item_id}

#e 覆蓋 HTTPException 處理器

只為錯誤返回純文本響應,而不是返回 JSON 格式的內容。

from fastapi import FastAPI, HTTPException
from fastapi.exceptions import RequestValidationError
from fastapi.responses import PlainTextResponse
from starlette.exceptions import HTTPException as StarletteHTTPExceptionapp = FastAPI()@app.exception_handler(StarletteHTTPException)
async def http_exception_handler(request, exc):return PlainTextResponse(str(exc.detail), status_code=exc.status_code)@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request, exc):return PlainTextResponse(str(exc), status_code=400)@app.get("/items/{item_id}")
async def read_item(item_id: int):if item_id == 3:raise HTTPException(status_code=418, detail="Nope! I don't like 3.")return {"item_id": item_id}

#e RequestValidationError 的請求體

RequestValidationError 包含其接收到的無效數據請求的 body
開發時,可以用這個請求體生成日志、調試錯誤,并返回給用戶。

from fastapi import FastAPI, Request, status
from fastapi.encoders import jsonable_encoder
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
from pydantic import BaseModelapp = FastAPI()@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):return JSONResponse(status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,content=jsonable_encoder({"detail": exc.errors(), "body": exc.body}),)class Item(BaseModel):title: strsize: int@app.post("/items/")
async def create_item(item: Item):return item

發送無效item

{"title": "towel","size": "XL"
}

收到422,Error: Unprocessable Entity的body響應體。

```json
{"detail": [{"type": "int_parsing","loc": ["body","size"],"msg": "Input should be a valid integer, unable to parse string as an integer","input": "XL"}],"body": {"title": "towel","size": "XL"}
}

#e 復用FastAPI異常處理器

FastAPI 支持先對異常進行某些處理,然后再使用 FastAPI 中處理該異常的默認異常處理器。從 fastapi.exception_handlers 中導入要復用的默認異常處理器,可以在處理異常之后再復用默認的異常處理器。

from fastapi import FastAPI, HTTPException
from fastapi.exception_handlers import (http_exception_handler,request_validation_exception_handler,
)
from fastapi.exceptions import RequestValidationError
from starlette.exceptions import HTTPException as StarletteHTTPExceptionapp = FastAPI()@app.exception_handler(StarletteHTTPException)
async def custom_http_exception_handler(request, exc):print(f"OMG! An HTTP error!: {repr(exc)}")return await http_exception_handler(request, exc)@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request, exc):print(f"OMG! The client sent invalid data!: {exc}")return await request_validation_exception_handler(request, exc)@app.get("/items/{item_id}")
async def read_item(item_id: int):if item_id == 3:raise HTTPException(status_code=418, detail="Nope! I don't like 3.")return {"item_id": item_id}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87178.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87178.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87178.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

408第一季 - 數據結構 - 排序

排序的概念 外部排序很難,后面都是內部排序 插入排序 直接插入排序 理解 這個排序第一輪是從第二個元素開始的 然后是從后往前一個一個比的 然后我們看i5的情況,會出現比較次數和移動次數的概念,這里97動了 然后i8時,49最好…

高效賬號信息管理工具,可安全隨機生成密碼

軟件介紹 今天給大家推薦一款安全可靠的密碼管理工具,幫助用戶輕松管理各類賬號密碼。 安全便捷的密碼解決方案 這是一款采用先進加密技術開發的密碼管理器,不僅可以生成高強度隨機密碼,還提供安全的賬號密碼備份存儲功能。 基礎安全設置 …

如何在markdown文件中(博客)添加emoji表情,讓你的博客看起來更加優雅

在Markdown中使用Emoji的完整指南 按分類快速參考的完整Emoji列表一、狀態指示類:bulb:二、提示信息類:bulb:三、內容類型類:bulb:四、操作指令類:bulb:五、進度狀態類:bulb:六、技術相關類:bulb:七、人員角色類:bulb:八、版本控制類:bulb: 你學會了嗎 按分類快速參考的完整Emo…

MAZANOKE:一款隱私優先的瀏覽器圖像優化工具及Docker部署指南

在日常工作中,大家是否經常遇到這樣的需求:需要壓縮圖片體積、調整圖片尺寸或轉換圖片格式,但又受限于數據安全要求無法將圖片上傳至公網?在我們之前開發的工單配置系統中,這類需求尤為常見。最近在GitHub上發現了一款…

【Vue PDF】Vue PDF 組件初始不加載 pdfUrl 問題分析與修復

Vue PDF 組件初始不加載 pdfUrl 問題分析與修復 問題現象 在開發 PDF 預覽組件時,遇到這樣一個問題: 初始狀態下,PDF 組件不會請求 pdfUrl(即不會加載 PDF 文件)。只有點擊"全屏"按鈕后,才會請…

《注解的江湖:一場元數據的“宮斗劇”》

一、你真的懂注解嗎 你是否使用過Autowired卻不知道是如何生效的? 這幾個注解你一定很熟悉: OverrideDeprecatedTransactional 那么你有進一步思考過怎么生效的嗎?注解到底是什么?注解,到底是信息?還是指…

智能土木通 - 土木工程專業知識問答系統02-RAG檢索模塊搭建

一、項目目錄 civil_qa_system/ ├── docs/ # 項目文檔 ├── config/ # 配置文件 ├── core/ # 核心功能代碼 ├── knowledge_base/ # 知識庫相關 ├── web/ # Web應用部分 ├…

進程和線程區別、管道和套接字、共享變量、TCP三次握手,是否可以少一次握手、子進程和主進程區別和API——Nodejs

首先講了進程和線程區別 然后講解 管道和套接字,它是進程間通信的方式 接著講解共享變量 ,它是線程間通信 最后講解TCP三次握手,因為套接字使用了TCP協議 一、線程和進程的區別 線程(Thread)和進程(Pr…

docker(學習筆記第一課) 使用nginx +https + wordpress

文章目錄 docker(學習筆記第一課) 使用nginx https wordpress學習內容:1. 整體架構1.1 在aws ec2的整體架構1.2 不懂都可以問AI 2. 構建詳細2.1 構建ec22.2 安裝docker2.3 創建一個docker的內部network2.4 創建wordpress使用的mysql數據庫2.5 創建兩個wordpress的d…

Leetcode 刷題記錄 15 —— 二分查找

本系列為筆者的 Leetcode 刷題記錄,順序為 Hot 100 題官方順序,根據標簽命名,記錄筆者總結的做題思路,附部分代碼解釋和疑問解答,01~07為C語言,08及以后為Java語言。 01 搜索插入位置 class Solution {pub…

C++核心編程(動態類型轉換,STL,Lanmda)

一. 類型轉換 二. STL 1. 容器 1.1 Vector(常用) 1.1.1 概述 特性: 動態數組: 想象成一個會自動變長變短的數組。起始在內存中是連續存儲的。 隨機訪問: 通過[]運算符或at()方法,可以瞬間(…

【圖像處理入門】8. 數學基礎與優化:線性代數、概率與算法調優實戰

摘要 圖像處理的核心離不開數學工具的支撐。本文將深入解析線性代數、概率論在圖像領域的應用,包括矩陣變換與圖像幾何操作的關系、噪聲模型的數學描述,以及遺傳算法、粒子群優化等智能算法在參數調優中的實踐。通過理論結合代碼案例,幫助讀者掌握從數學原理到工程優化的完…

操作系統八股文

一.進程和線程的區別 1.本質區別和所屬關系是什么? 進程是資源調度以及分配的基本單位。 線程是CPU調度的基本單位。 一個線程屬于一個進程,一個進程可以擁有多個線程。 2.地址空間和內存 進程擁有獨立的虛擬地址空間。 線程沒有獨立的地址空間&#xf…

【uniapp】小程序中input輸入框的placeholder-class不生效

解決方法 1.去掉scoped <style></style> 2.額外寫一組style </style lang"scss" scoped> </style> <style> ::v-deep .textarea-placeholder { font-size: 24rpx; font-weight: 400; …

大模型訓練與推理顯卡全指南:從硬件選型到性能優化

在人工智能技術飛速發展的今天&#xff0c;大型語言模型(LLM)已成為推動行業進步的核心動力。然而&#xff0c;訓練和部署這些“數字巨人”需要強大的計算基礎設施作為支撐&#xff0c;其中GPU的選擇直接決定了模型開發的效率與成本。本文將全面剖析當前主流GPU型號在大模型訓練…

Linux Docker的環境配置與簡單使用

參考資料 Windows Docker Desktop設置中文【Docker 】Docker Desktop for Windows&#xff08;WSL 2&#xff09;安裝WSL 2 上的 Docker 遠程容器入門 目錄 一. 環境配置1.1 安裝WSL1.2 安裝配置 Docker Desktop1.3 VS Code 插件安裝1.4 下載項目&#xff0c;配置Dockerfile 二…

函數指針與指針函數:本質區別與高級應用

目錄 一、概念本質解析 1. 函數指針&#xff08;Function Pointer&#xff09; 2. 指針函數&#xff08;Pointer Function&#xff09; 二、函數指針深度剖析 1. 基礎用法示例 2. 高級應用&#xff1a;回調函數 3. 函數指針數組 三、指針函數深入探討 1. 基礎實現模式 …

【python】基于pycharm的海康相機SDK二次開發

海康威視二次開發相機管理 這段代碼基于python開發的&#xff0c;用了opencv的一些庫函數。實現了一個完整的海康機器人相機管理工具&#xff0c;支持多相機連接、參數配置、圖像采集和實時顯示功能。目前USB相機測試無誤&#xff0c;除了丟一些包。 1. 主要類結構 HKCameraM…

HTTP 協議各個主要版本的功能特點、核心原理、使用場景總結

我們來系統總結一下 HTTP 協議各個主要版本的功能特點、核心原理&#xff08;用圖示輔助說明&#xff09;以及典型使用場景。 核心演進目標&#xff1a; 提升性能、安全性、效率和靈活性。 1. HTTP/0.9 (1991) - 遠古雛形 功能特點: 極其簡單&#xff1a; 只支持 GET 方法。無…

Linux編程:3、進程通信-信號

一、進程通信概述 &#xff08;一&#xff09;進程通信的目的 在企業開發中&#xff0c;一個項目常常需要多個進程共同協作&#xff0c;而這些進程之間需要進行通信&#xff08;交換信息&#xff09;以便協作。本章內容主要圍繞信號講解&#xff0c;其它進程通信的常用方式請…