TL;DR
''.join(traceback.TracebackException.from_exception(exc).format())
従来の方法
tracebackを文字列で取得する方法として traceback.format_exception() がよく紹介されています。
import traceback
try:
1/0
except Exception as e:
t = traceback.format_exception(type(e), e, e.__traceback__)
print(t)
# ['Traceback (most recent call last):\n',
# ' File "/path/to/script.py", line 4, in <module>\n 1/0\n',
# 'ZeroDivisionError: division by zero\n']
この書き方は冗長です。エラーひとつに対して etype
, value
, tb
の3つの引数を与えなくてはなりません。
(引数 e_type
は Python3.5 からは無視される仕様となったため、 None
で代用できます)
より単純な書き方
Python3.5 から TracebackException が導入され、より単純に同じことを実現できるようになりました。
import traceback
try:
1/0
except Exception as e:
t = list(traceback.TracebackException.from_exception(e).format())
print(t)
# ['Traceback (most recent call last):\n',
# ' File "/path/to/script.py", line 4, in <module>\n 1/0\n',
# 'ZeroDivisionError: division by zero\n']
TracebackException.format()
は文字列のジェネレータを返す点に注意してください。
謝辞
TracebackException
について教えてくださった python.jp の atsuoishimoto さんに感謝申し上げます。
の