Python のエラー出力ついて備忘録を残します。
記事内のコードは Python3.8.6 で動作確認しています。
Python の例外についてもっと詳しく知りたい方は以下の公式ドキュメントも併せてご参照ください。
例外オブジェクトのキホン
Pythonではエラーハンドリングを次のように行います。
try:
# 危険な処理
except Exception as e:
# 例外処理
try
句で 発生した 例外オブジェクト は except Exception as e:
の e
に格納されます。格納する変数名は任意のもので構いませんが、一般には e
が用いられている印象です。以下本稿では 例外オブジェクト を e
と表現します。
公式ドキュメントでは 例外オブジェクト を N
identifier
err
inst
としている箇所もあります。また、as e
の記述は必須ではありません。
e
は常に BaseException
クラスを継承したインスタンスを格納します。
例外サンプル
例外オブジェクト
例外オブジェクトを用いることでシンプルな情報を取得することが可能です。
>>> 1/0
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# ZeroDivisionError: division by zero
try:
1/0
except Exception as e:
print(e.__class__.__name__) # ZeroDivisionError
print(e.args) # ('division by zero',)
print(e) # division by zero
print(f"{e.__class__.__name__}: {e}") # ZeroDivisionError: division by zero
基本的に個人開発で必要なのは 例外名 と その説明 程度かと思いますので以上で十分かと思いますが Traceback ...
の部分の取得についても調べたので説明します。
traceback
traceback
は システムトレースを取得するための標準ライブラリです。このライブラリを使用することで Traceback ...
の部分を取得することができます。基本的に戻り値は str
ですので、トレースの結果に応じて処理を分岐させるためには細かな文字列操作が必要となります。
トレースを取得する上で必要なメソッドは図に示した通りです。図中では省略していますがそれぞれのメソッドは以下の通りに引数を要求します。
import sys
import traceback
try:
1/0
except Exception as e:
# 発生中の例外に関する情報を取得する
etype, value, tb = sys.exc_info()
traceback.format_exception(etype, value, tb) # list[str] を返す
traceback.format_tb(tb) # list[str] を返す
traceback.format_exception_only(etype, value) # list[str] を返す
traceback.format_exc() # tuple[str] を返す
print(traceback.format_exception(etype, value, tb))
# 出力(見やすいように整形しています)
['Traceback (most recent call last):\n',
' File '
'"c:\\...\\main.py", '
'line 5, in <module>\n'
' 1/0\n',
'ZeroDivisionError: division by zero\n']
このように traceback
のメソッドを実行すると改行文字 \n
を含めた list
が返されます。
例では traceback.format_exception(...)
を取り上げましたが、他二つのメソッドについても同様です。
traceback.format_exc()
traceback.format_exc()
というメソッドも用意されています。このメソッドは一切の引数を取りません。内部的に sys.exc_info()
をアンパックして traceback.format_exception(...)
に渡す省略表現です(参考)。より簡潔に記述することが可能です。
単に Traceback ...
を記録するだけの場合は traceback.print_exception()
等のメソッドが存在します。
リストで取得する | ターミナルやファイルに出力する |
---|---|
format_exception() |
print_exception() |
format_tb() |
print_tb() |
format_exception_only() |
該当なし |
format_exc() |
print_exc() |