この記事では、Pythonプログラムでハンドルされなかった例外が発生した際に表示されるトレースバック
情報を、traceback
モジュールを使って文字列として取得し、ログファイルなどに記録する方法を解説します。
トレースバックとは
Pythonプログラムがエラーでクラッシュすると、エラーが発生するまでの関数呼び出しの履歴がコンソールに表示されます。この履歴がトレースバック
(またはスタックトレース
)です。
トレースバックには、エラーが発生したファイル名、行番号、関数名、そして例外の種類とメッセージが含まれており、デバッグのための重要な手がかりとなります。
def function_a():
function_b()
def function_b():
# ここで意図的に例外を発生させる
raise Exception("これは意図的なエラーメッセージです。")
# function_a() # この関数を呼び出すとコンソールにトレースバックが表示される
このコードを実行すると、function_a
がfunction_b
を呼び出し、function_b
で例外が発生した、という一連の流れがトレースバックとして出力されます。
traceback.format_exc()
でトレースバックを文字列として取得する
traceback
モジュールのformat_exc()
関数は、try...except
文のexcept
ブロック内で呼び出すことで、発生した例外のトレースバック情報を整形された文字列として返します。
これにより、プログラムをクラッシュさせる代わりに例外を捕捉し、その詳細なデバッグ情報をファイルに書き出したり、ログシステムに送信したりすることが可能になります。
トレースバック情報をファイルに記録する
以下は、try...except
ブロックで例外を捕捉し、traceback.format_exc()
を使ってそのトレースバック情報をテキストファイルに保存する実用的な例です。
import traceback
try:
# 意図的に例外を発生させる
raise Exception("データ処理中に問題が発生しました。")
except:
# 'error_log.txt'というファイルを書き込みモードで開く
# with文を使い、ファイルの自動クローズを保証する
with open('error_log.txt', 'w', encoding='utf-8') as error_file:
# traceback.format_exc()でトレースバック文字列を取得し、ファイルに書き込む
error_info_string = traceback.format_exc()
error_file.write(error_info_string)
print("トレースバック情報をerror_log.txtに書き込みました。")
このスクリプトを実行すると、カレントディレクトリにerror_log.txt
というファイルが作成され、その中にはコンソールに表示されるのと同様の、詳細なトレースバック情報が記録されます。
error_log.txt
のファイル内容の例:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
Exception: データ処理中に問題が発生しました。
まとめ
traceback.format_exc()
関数は、プログラムの堅牢性を高めるための重要なツールです。try...except
文と組み合わせることで、プログラムが予期せぬエラーで停止するのを防ぎつつ、デバッグに必要な詳細なトレースバック情報を文字列として取得し、ファイルなどに永続的に記録することができます。