2-5. Pythonのトレースバックの読み方

1. トレースバックとは

トレースバック(Traceback)とはエラーが発生した時、どのファイルのどの場所で、なぜエラーになったかの追跡情報です。
エラーの原因を探るための、重要な情報になります。

例えば、定義していない変数をprint文で表示しようとすると、以下のようなトレースバックが表示されます。

print(z)

>> Traceback (most recent call last):
>>    File "/Users/xxx/Documents/xxx/python_code/study_code.py", line 1, in 
>>     print(z)
>> NameError: name 'z' is not defined

2. トレースバックの読み方

トレースバックはエラーが発生した行から、エラーの原因となった箇所まで遡って出力されます。

例えば、以下のようなプログラムを実行したとします。
def文の説明は省きますが、これはdef文から他のdef文を呼び出していて、function3 → function2 → function1 と処理されています。
最後のfunction1の中で、定義していない zzz という変数を呼び出してエラーになります。

def function1():
    print(zzz) # 定義していない変数


def function2():
    function1() # function1を呼び出す


def function3():
    function2() # function2を呼び出す


function3() # function2を呼び出す

上記のプログラムを動かすと、以下のようなトレースバックが表示されます。

 Traceback (most recent call last):
   File "/Users/xxx/Documents/PythonSup/python_code/study_code.py", line 10, in <module>
     function3()
   File "/Users/xxx/Documents/PythonSup/python_code/study_code.py", line 8, in function3
     function2()
   File "/Users/xxx/Documents/PythonSup/python_code/study_code.py", line 5, in function2
     function1()
   File "/Users/yuko/Documents/PythonSup/python_code/study_code.py", line 2, xxx function1
     print(zzz)
 NameError: name 'zzz' is not defined 


上から順に

  • study_code.pyファイルの10行目のfunction3()
  • study_code.pyファイルの8行目のfunction2()
  • study_code.pyファイルの5行目のfunction1()
  • study_code.pyファイルの3行目のprint(zzz)

と追跡されて、最後に「名前のエラー: ‘zzz’ が定義されていません」と原因が書かれています。
このように、どのような処理が呼び出されたのかと、実際にエラーとなった箇所と原因がわかるようになっています。


考察. エラーメッセージの重要性

Pythonのトレースバックだけではなく、プログラムやシステムでエラーが発生した場合、多くはエラーメッセージやエラーコードが表示されます。
それはその言語やシステムを作った人が、エラーになった原因を使用者に教えるために作られた、大切なメッセージです

英語のエラーメッセージだと心理的な抵抗を感じる人もいるかもしれません。しかし、自分のコードがエラーになったとき、思いつきや勘でコードを直したりせずに、まずは愚直にエラーを読んでコードを直す癖をつけましょう。それが良いプログラマーになるための第一歩です。


このエントリーをはてなブックマークに追加