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