メインコンテンツまでスキップ

error-handling

エラー処理

  • route.get(errors=VioletsAreBlue)を使用してエンドポイントレスポンスを宣言
class VioletsAreBlue(HTTPException[str]):
"how about you?"
__status__ = 418


@lhl.post(errors=VioletsAreBlue)
async def roses_are_red():
raise VioletsAreBlue("I am a pythonista")
  • lihil.problems.problem_solverをデコレータとして使用してエラーハンドラーを登録し、エラーは問題詳細として解析されます。
from lihil.problems import problem_solver

# 注:excには型ユニオンを使用できます。例:UserNotFound | status.NOT_FOUND
@problem_solver
def handle_404(req: Request, exc: Literal[404]):
return Response("resource not found", status_code=404)

特定の例外タイプ(例:UserNotFound)を処理するソルバーは、ステータスコード(例:404)を処理するソルバーよりも優先されます。

例外-問題マッピング

lihilはHTTPExceptionに基づいてレスポンスとドキュメントを自動生成します。 以下はroses_are_redエンドポイント用に生成されたドキュメントです

External documentationタブの下のURLをクリック

詳細な問題ページが表示されます

デフォルトでは、すべてのエンドポイントはInvalidRequestErrors用にコード422の少なくとも1つのレスポンスを持ちます。

以下はInvalidRequestErrorsのレスポンス例です。

{
"type_": "invalid-request-errors",
"status": 422,
"title": "Missing",
"detail": [
{
"type": "MissingRequestParam",
"location": "query",
"param": "q",
"message": "Param is Missing"
},
{
"type": "MissingRequestParam",
"location": "query",
"param": "r",
"message": "Param is Missing"
}
],
"instance": "/users"
}
  • レスポンスの作成を変更するには、lihil.problems.problem_solverを使用してソルバーを登録してください。
  • ドキュメントを変更するには、DetailBase.__json_example__DetailBase.__problem_detail__をオーバーライドしてください。
  • エラー詳細を拡張するには、HTTPException[T]を継承する際に型変数を提供してください。