メモの日々


2023年01月02日(月) [長年日記]

[python] Pythonで例外のスタックトレース情報を得る

Pythonではtraceback.fromat_exc()などで例外のスタックトレースを得られるが、これで得られる文字列は冗長なので、その元データを得たいときがある。

スタックトレースを文字列ではなくデータとして得るには、traceback.extract_tb()を使うのがよさそうだ。

この関数はStackSummaryオブジェクトを返し、これはFrameSummaryの配列だ。FrameSummaryからは、filename, lineno, name, line, locals といった情報を得られる(ドキュメントには見当たらないがソースコードを見るとわかる)。

例外オブジェクトには__traceback__属性があるので、これをextract_tb()に渡せば例外のスタックトレースデータを得られる。

import traceback

def f():
    g()

def g():
    raise RuntimeError()

try:
    f()
except Exception as ex:
    for frame in traceback.extract_tb(ex.__traceback__):
        print(f"{frame.name} at {frame.filename}:{frame.lineno}")
<module> at /home/kenichi/work/python/stacktrace_sample.py:10
f at /home/kenichi/work/python/stacktrace_sample.py:4
g at /home/kenichi/work/python/stacktrace_sample.py:7