這是 Django Ninja 系列教學的第 21 篇。
在軟體開發中,錯誤處理是一個不容忽視——但常常被忽視——的環節。
不誇張地說,錯誤處理是一個「做得好沒人誇,做不好系統就慘兮兮」的議題。
沒關係,我們還是盡可能把自己做好。
Django Ninja 使用 Pydantic 進行資料驗證,失敗時,預設回應「422 Unprocessable Entity」。
然而,我們有時候需要回應「400 Bad Request」或別的狀態碼,以符合現實業務需求或團隊開發習慣。
總之,無論出於何種原因,我們想自訂錯誤訊息、格式,以及回應的狀態碼,而不使用 Django Ninja 預設的 422 回應——不得不說,這個制式回應的資訊有點多、結構有點複雜,因為它要兼容各種情況。
本文將介紹如何自定義錯誤處理與回應——使用 Django Ninja 內建的HttpError
。
所有的程式碼改動,可參考這個 PR。
Django Ninja 的自動錯誤處理
上一篇我們提到,如果你在 Schema 的驗證方法中,拋出ValueError
錯誤,Django Ninja 將會自動捕捉並回應。
事實上,不止ValueError
,Django Ninja 還會替你處理以下這幾種錯誤:
pydantic.ValidationError
,來自 Pydantic 的驗證錯誤,這是為何當 Schema 欄位有問題時,我們會直接收到 422 回應。
- 此外,Django Ninja 還內建了一個
ninja.errors.ValidationError
,這些錯誤同樣會返回 422。
ninja.errors.HttpError
:這是本文的重點,下面會介紹。
這些都是 Django Ninja 會自動捕捉的錯誤,但不是每一種都給出制式的 422 回應——第三種就不是。