Python Tracebackスタックトレースの解析

Python Tracebackスタックトレースを解析・分析。most-recent-call-last順序のPython例外からファイルパス、行番号、関数名、エラータイプを抽出します。

Python

詳細な説明

Python Tracebackの理解

Pythonはスタックトレースに「traceback」という用語を使用します。tracebackは例外に至った関数呼び出しのシーケンスをmost-recent-call-last順で表示します --- JavaScriptやJavaの慣例とは逆です。

標準Tracebackフォーマット

Traceback (most recent call last):
  File "/app/main.py", line 45, in handle_request
    result = process_data(payload)
  File "/app/services/processor.py", line 128, in process_data
    validated = schema.validate(data)
  File "/app/lib/validator.py", line 67, in validate
    raise ValidationError(f"Invalid field: {field}")
ValidationError: Invalid field: email

Tracebackコンポーネント

Python tracebackの各フレームには以下が含まれます:

  • File --- Pythonファイルの絶対パスまたは相対パス
  • line --- ファイル内の行番号
  • in --- 関数名またはメソッド名(トップレベルコードの場合は<module>
  • コードスニペット --- 実際のコード行(次の行にインデントされて表示)

読み順序

最初のフレーム(上部)が最も外側の呼び出しで、最後のフレーム(下部)が例外が発生した場所です。エラータイプとメッセージは最後の行に表示されます。これはJavaScriptのトレースとは逆です。

例外チェーン

Python 3はraise X from Yによる例外チェーンと暗黙のチェーン(別の例外を処理中に例外が発生した場合)をサポートしています。

一般的なPython例外タイプ

  • TypeError --- 関数に間違った型が渡された
  • ValueError --- 正しい型だが無効な値
  • KeyError --- 辞書キーが見つからない
  • AttributeError --- オブジェクトに属性が存在しない
  • ImportError/ModuleNotFoundError --- モジュールをインポートできない

ユースケース

Python tracebackはWebフレームワーク(Django、Flask、FastAPI)、データサイエンスノートブック(Jupyter)、コマンドラインツール、バックグラウンドタスクワーカー(Celery)で遭遇します。エラーメッセージから関連するアプリケーションコードのフレームにすばやくナビゲーションし、ライブラリやフレームワークのフレームをスキップすることで、特に本番インシデントでのデバッグが大幅に加速します。

試してみる — Stack Trace Parser & Formatter

フルツールを開く