まちがいと向き合う

INPUT · スライド

トレースバックを読む

01 / 07

エラーと一緒に出る長い文字

エラーが起きると、Pythonは最後の1行だけでなくそこへどうやって来たかも一緒に出してくれる。この長い文字のかたまりをトレースバック(たどった跡)と呼ぶよ。

見た目はこわいけれど、読む場所は決まっている。全部を読む必要はまったくないんだ。

このレッスンで、読む場所を3つだけ覚えよう。

02 / 07

実物を見てみる

下のコードを動かすと、こんなトレースバックが出るよ。

Traceback (most recent call last):  File "/lib/python314.zip/_pyodide/_base.py", line 523, in eval_code    .run(globals, locals)     ~~~^^^^^^^^^^^^^^^^^  File "/lib/python314.zip/_pyodide/_base.py", line 357, in run    coroutine = eval(self.code, globals, locals)  File "<exec>", line 2, in <module>IndexError: list index out of range

8行もあるけれど、あなたに関係があるのは下の2行だけ。上のほうは、このアプリがあなたのコードを動かすためのしくみの話だよ。

kudamonos = ["りんご", "みかん", "ぶどう"]print(kudamonos[5])

実行結果

IndexError: list index out of range

03 / 07

1つめ、exec から下だけ見る

File "<exec>" と書いてある行を探そう。そこから下が、あなたの書いたコードの話だよ。

それより上に出てくる _pyodide/_base.py は、このアプリがPythonを動かすために使っているファイル。あなたのコードとは関係がないので、まるごと読み飛ばしていい。

<exec> は「いま実行しているコード」という意味のしるし。あなたのプログラムには、この名前がついているんだ。

04 / 07

2つめ、いちばん下の1行が結論

いちばん下の1行を読もう。そこに 種類: 本文 が書いてある。

前のレッスンでやった IndexError や KeyError が、ここに出てくるよ。何が起きたのかは、この1行でほぼ分かる。

長いトレースバックを見たら、まず目を下まで走らせよう。上から順に読もうとすると、関係のない行で疲れてしまうよ。

nedans = {"りんご": 120}print(nedans["ぶどう"])

実行結果

KeyError: 'ぶどう'

05 / 07

3つめ、line N が行番号

<exec> の行に書いてある line N が、あなたのコードの行番号だよ。

File "<exec>", line 2, in <module> なら、2行目でエラーが起きたということ。そこを見に行けばいい。

うしろの in <module> は「関数の中ではなく、いちばん外側で起きた」という意味。関数の中で起きたときは、ここに関数の名前が入るよ。

06 / 07

関数が関数を呼ぶと長くなる

関数の中でエラーが起きると、<exec> の行が何本も並ぶ。下のコードだと、こう出るよ。

  File "<exec>", line 7, in <module>  File "<exec>", line 5, in keisan  File "<exec>", line 2, in waruZeroDivisionError: division by zero

並び順は呼んだ順。7行目で keisan を呼び、その5行目で waru を呼び、その2行目の割り算で失敗した。

だからいちばん下の <exec> の行が、実際にエラーが起きた場所。上の行は、そこへ来るまでの道のりだよ。

def waru(a, b):    return a / bdef keisan(x):    return waru(x, 0)print(keisan(10))

実行結果

ZeroDivisionError: division by zero

07 / 07

下から上へ読む

まとめると、トレースバックは下から上へ読むよ。

  • いちばん下の1行で何が起きたかを知る
  • そのすぐ上の <exec> の行でどこで起きたかを知る
  • まだ分からなければ、さらに上へさかのぼってどうやってそこへ来たかをたどる

これだけで、たいていのエラーは原因にたどりつける。

ただし、エラーが出ないのに答えがまちがっているときは、トレースバックが助けてくれない。次のレッスンでは、そのときの手を覚えるよ。