ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Python - traceback:プログラムの実行中の関数呼び出し履歴を表示する

初めに

 tracebackは実行中のコンピュータプログラムにエラーが発生した際に、直前に実行していた関数やメソッドなどの履歴を表示するために使われるモジュールです。本記事はtracebackの使い方をまとめます。

tracebackとは

 tracebackモジュールは、Pythonプログラムのスタックトレースを抽出し、書式を整え、表示するための標準インターフェースを提供します。

スタックトレース

 実行中のコンピュータプログラムにエラーが発生した際に、直前に実行していた関数やメソッドなどの履歴を表示することをスタックトレースといいます。

基本的な使い方

 tracebackモジュールをインポートして使用します。

 エラー発生時にログを表示させるには、traceback.print_exc()関数を用います。

import traceback    # tracebackのインポート

try:
    result = 1 / 0
    print(result)
except Exception as e:
    traceback.print_exc()   # エラー時にスタックトレースを表示

スタックトレース

 スタックトレースは次のように記述されています。

  • エラーが発生したファイル名、行
  • エラー部分のコード
  • 例外の型とその理由

tracebackモジュールを使う意味

 実は、次のコードのようにtracebackモジュールと使わなくても自動でスタックトレースが表示されます。

result = 1 / 0
print(result)

 では、trackbackモジュールはどのような場合に使われるのかというと、スタックトレースのログを別ファイルに出力したい場合です。

 スタックトレースの記録をとることで、問題発生時の状況を後から確認できるようにし、再現性を向上させたり、チームでの情報共有したりすることに役立ちます。

ログ出力

 ログファイルにスタックトレースを出力するにはtracebackモジュールとloggingモジュールを使います。

import traceback
from logging import getLogger, FileHandler, Formatter, DEBUG

# ロガーの取得
logger = getLogger(__name__)

# ログレベルの設定
logger.setLevel(DEBUG)

# ログ出力フォーマットの設定
formatter = Formatter('%(asctime)s %(levelname)s %(message)s')
file_handler = FileHandler("log.txt")
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

def main():
    try:
        result = 1 / 0
        print(result)
    except Exception as e:
        # 例外メッセージとトレースバックの出力
        t = traceback.format_exc()
        logger.debug(t)

if __name__ == "__main__":
    main()

(出力結果)

 loggingモジュールの使い方については、以前記事にまとめましたので、よろしければご覧ください。