Python - traceback:プログラムの実行中の関数呼び出し履歴を表示する
初めに
tracebackは実行中のコンピュータプログラムにエラーが発生した際に、直前に実行していた関数やメソッドなどの履歴を表示するために使われるモジュールです。本記事はtracebackの使い方をまとめます。
基本的な使い方
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モジュールの使い方については、以前記事にまとめましたので、よろしければご覧ください。