LoginSignup
8
8

【図解で覚える】Python のエラー出力

Last updated at Posted at 2023-02-01

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

Fig1_ExceptionObject.png

基本的に個人開発で必要なのは 例外名その説明 程度かと思いますので以上で十分かと思いますが Traceback ... の部分の取得についても調べたので説明します。

traceback

traceback は システムトレースを取得するための標準ライブラリです。このライブラリを使用することで Traceback ... の部分を取得することができます。基本的に戻り値は str ですので、トレースの結果に応じて処理を分岐させるためには細かな文字列操作が必要となります。

Fig2_StandardLibraryTraceback.png

トレースを取得する上で必要なメソッドは図に示した通りです。図中では省略していますがそれぞれのメソッドは以下の通りに引数を要求します。

main.py
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(...) に渡す省略表現です(参考)。より簡潔に記述することが可能です。

Fig3_BuiltInSyntaxSuger.png

単に Traceback ... を記録するだけの場合は traceback.print_exception() 等のメソッドが存在します。

リストで取得する ターミナルやファイルに出力する
format_exception() print_exception()
format_tb() print_tb()
format_exception_only() 該当なし
format_exc() print_exc()
8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8