FastAPIのHTTPExcrptionはログに出しても空文字列の可能性がある
FastAPIでHTTPExceptionをログに出力しようとした時のメモ。
環境
- 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')
原因
FastAPIのHTTPExceptionはStarletteのHTTPExceptionを継承しています。
しかし、StarletteのHTTPExceptionに__str__が2023年6月21日まで定義されていませんでした。そのため、FastAPIが依存しているStarletteのバージョンが古いとstrで文字列化しても空文字列が返却されます。
さらに詳細
PythonのExceptionは位置引数をログに出力してくれますが、キーワード引数はログに出力してくれないようです。
HTTPExceptionはstatus_codeとdetailというキーワード引数でパラメータ指定をするので、位置引数に何も設定されず、文字列化されなかったようです。
except節は例外名の後に変数を指定できます。その変数は例外インスタンスに紐付けられ、一般的には引数を保持する args 属性を持ちます。利便性のため、組み込み例外型には str() が定義されており、明示的に .args を参照せずとも すべての引数を表示できます。
ソースコード
なし。
終わりに
ログ出力するには単純に文字列化すればよいと考えていましたが、ちょっとハマってしまいました。