きり丸の技術日記

技術検証したり、資格等をここに残していきます。

FastAPIのHTTPExcrptionはログに出しても空文字列の可能性がある

FastAPIHTTPExceptionをログに出力しようとした時のメモ。

環境

  • Python
    • 3.12.3
  • FastAPI
    • 0.103.1
    • 0.110.0

対応

少し古いFastAPIのライブラリなら、reprを使用してシリアライズしてください。もし、strで検証しても空文字列でなければ、そのままでも問題ありません。

from fastapi import HTTPException

exc = HTTPException(status_code=404, detail='NOT_FOUND')
print(exc)
# '' # 空文字列の可能性がある
# 404: NOT_FOUND # 新しいとこっちのメッセージ
print(repr(exc))
# HTTPException(status_code=404, detail='NOT_FOUND')

原因

FastAPIHTTPExceptionStarletteHTTPExceptionを継承しています。

しかし、StarletteHTTPException__str__が2023年6月21日まで定義されていませんでした。そのため、FastAPIが依存しているStarletteのバージョンが古いとstrで文字列化しても空文字列が返却されます。

さらに詳細

PythonのExceptionは位置引数をログに出力してくれますが、キーワード引数はログに出力してくれないようです。

HTTPExceptionはstatus_codeとdetailというキーワード引数でパラメータ指定をするので、位置引数に何も設定されず、文字列化されなかったようです。

except節は例外名の後に変数を指定できます。その変数は例外インスタンスに紐付けられ、一般的には引数を保持する args 属性を持ちます。利便性のため、組み込み例外型には str() が定義されており、明示的に .args を参照せずとも すべての引数を表示できます。

ソースコード

なし。

終わりに

ログ出力するには単純に文字列化すればよいと考えていましたが、ちょっとハマってしまいました。

参考情報