錯誤處理(上)HttpError 與自定義 HTTP 回應
這是 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 回應——第三種就不是。