5.1 モジュール traceback
スタックトレース (traceback)
は、例外を引き起こした関数呼び出しの順序を示す情報だよ。デバッグの重要なツールで、どこで、なぜエラーが発生したのかを開発者が理解するのに役立つんだ。
スタックトレース (traceback)
の分析はプログラムのデバッグにおいて重要で、どこで、なぜエラーが発生したのかを開発者が理解する手助けをしてくれる。Pythonはモジュール traceback
を提供していて、スタックトレースを扱うための関数が含まれている。これでスタックトレースの情報を抽出、フォーマット、表示できるんだ。
スタックトレースの取得と処理
スタックトレースを扱うには、モジュールtraceback
をインポートする必要があって、それにはスタックトレースの形式と表示のための関数が提供されているよ。
スタックトレースの取得と表示の例:
import traceback
def function_c():
return 1 / 0 # これはZeroDivisionErrorを引き起こすよ
def function_b():
function_c()
def function_a():
try:
function_b()
except ZeroDivisionError as e:
print("例外が発生しました:")
traceback.print_exc() # スタックトレースを印刷します
function_a()
出力:
例外が発生しました:
Traceback (most recent call last):
File "example.py", line 12, in function_a
function_b()
File "example.py", line 8, in function_b
function_c()
File "example.py", line 4, in function_c
return 1 / 0
ZeroDivisionError: division by zero
関数 traceback.print_exc()
この関数は、現在の例外のスタックトレースを標準エラーストリームに印刷するよ。
例:
try:
1 / 0
except ZeroDivisionError:
traceback.print_exc()
関数 traceback.format_exc()
この関数は、現在の例外のフォーマットされたスタックトレースを文字列として返すんだ。
try:
1 / 0
except ZeroDivisionError:
error_message = traceback.format_exc()
print("取得したスタックトレースは文字列として:")
print(error_message)
関数 traceback.extract_tb(tb)
この関数は、sys.exc_info()
を通じて取得できるトレースバックオブジェクト(traceback object)
から"生"のスタックトレース情報を抽出するよ。スタックフレームのリストを返すんだ。
5.2 スタックトレースの処理と分析
関数 traceback.format_tb(tb)
この関数は、スタックトレースを表すフォーマットされた文字列リストを返すよ。
import sys
import traceback
def function_c():
return 1 / 0 # これはZeroDivisionErrorを引き起こすよ
def function_b():
function_c()
def function_a():
try:
function_b()
except ZeroDivisionError:
tb = sys.exc_info()[2]
formatted_tb = traceback.format_tb(tb)
print("フォーマットされたスタックトレース:")
for line in formatted_tb:
print(line, end="")
function_a()
関数 traceback.format_exception(exc_type, exc_value, exc_tb)
この関数は、例外とスタックトレースを表す完全なフォーマット済みの文字列リストを返すよ。
import sys
import traceback
def function_c():
return 1 / 0 # これはZeroDivisionErrorを引き起こすよ
def function_b():
function_c()
def function_a():
try:
function_b()
except ZeroDivisionError as e:
exc_type, exc_value, exc_tb = sys.exc_info()
full_tb = traceback.format_exception(exc_type, exc_value, exc_tb)
print("完全なフォーマット済みスタックトレース:")
for line in full_tb:
print(line, end="")
function_a()
時には、スタックフレームをより詳細に分析して、どこで例外が発生したのか、その場所の文脈について具体的な情報を得るのが役に立つことがあるよ。
import traceback
import sys
def function_c():
return 1 / 0 # これはZeroDivisionErrorを引き起こすよ
def function_b():
function_c()
def function_a():
try:
function_b()
except ZeroDivisionError:
tb = sys.exc_info()[2]
for frame in traceback.extract_tb(tb):
print(f"ファイル: {frame.filename}")
print(f"行: {frame.lineno}")
print(f"関数名: {frame.name}")
print(f"テキスト: {frame.line}")
print("-" * 40)
function_a()
5.3 traceback
を使ったログ記録
時には、スタックトレースの情報をログファイルに保存して後で分析することが重要なんだ。それはモジュールtraceback
の関数と標準のモジュール logging
を使ってできるよ。
例:
import logging
import traceback
import sys
logging.basicConfig(filename='error.log', level=logging.ERROR)
def function_c():
return 1 / 0 # これはZeroDivisionErrorを引き起こすよ
def function_b():
function_c()
def function_a():
try:
function_b()
except ZeroDivisionError as e:
exc_type, exc_value, exc_tb = sys.exc_info()
full_tb = traceback.format_exception(exc_type, exc_value, exc_tb)
logging.error("例外が発生しました:\n%s", ''.join(full_tb))
function_a()
ロギングについてはもうちょっと後で見るけど、この情報が役立ったらいいな。
GO TO FULL VERSION