01 / 07
エラーと一緒に出る長い文字
エラーが起きると、Pythonは最後の1行だけでなくそこへどうやって来たかも一緒に出してくれる。この長い文字のかたまりをトレースバック(たどった跡)と呼ぶよ。
見た目はこわいけれど、読む場所は決まっている。全部を読む必要はまったくないんだ。
このレッスンで、読む場所を3つだけ覚えよう。
まちがいと向き合う
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 range8行もあるけれど、あなたに関係があるのは下の2行だけ。上のほうは、このアプリがあなたのコードを動かすためのしくみの話だよ。
kudamonos = ["りんご", "みかん", "ぶどう"]print(kudamonos[5])実行結果
IndexError: list index out of range
03 / 07
File "<exec>" と書いてある行を探そう。そこから下が、あなたの書いたコードの話だよ。
それより上に出てくる _pyodide/_base.py は、このアプリがPythonを動かすために使っているファイル。あなたのコードとは関係がないので、まるごと読み飛ばしていい。
<exec> は「いま実行しているコード」という意味のしるし。あなたのプログラムには、この名前がついているんだ。
04 / 07
いちばん下の1行を読もう。そこに 種類: 本文 が書いてある。
前のレッスンでやった IndexError や KeyError が、ここに出てくるよ。何が起きたのかは、この1行でほぼ分かる。
長いトレースバックを見たら、まず目を下まで走らせよう。上から順に読もうとすると、関係のない行で疲れてしまうよ。
nedans = {"りんご": 120}print(nedans["ぶどう"])実行結果
KeyError: 'ぶどう'
05 / 07
<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
まとめると、トレースバックは下から上へ読むよ。
<exec> の行でどこで起きたかを知るこれだけで、たいていのエラーは原因にたどりつける。
ただし、エラーが出ないのに答えがまちがっているときは、トレースバックが助けてくれない。次のレッスンでは、そのときの手を覚えるよ。