edubun
日本語

エラーメッセージの読み方と小さなプロジェクト

Pythonのトレースバックは下から読みます。最後の行がエラーの名前を示し、その上のコードの行が、起きた場所を示します。

1947年に記録帳に貼られた蛾

背景1947年、ハーバード大学のMark IIコンピュータに取り組んでいた技術者たちが、部品の1つに蛾がはさまっているのを見つけました。彼らは虫を記録帳に貼り付け、横に「first actual case of bug being found」と書きました。そのページは今、スミソニアンの国立アメリカ歴史博物館にあります。博物館自身の説明は、よく知られた2つの細部について慎重です。技術者はずっと前から小さな故障を「バグ」と呼んでいて、トーマス・エジソンも1870年代にこの語を使ったので、蛾がこの言葉を生んだわけではありません。冗談が通じるのは、この語がすでにあったからです。また、その年Mark IIのチームにいたグレース・ホッパーは、おそらくその記録帳をつけていませんでしたが、彼女とチームは、「バグ」と「デバッグ」をプログラマの日常の言葉にする助けになりました。

今日のバグの大半は、コードの中の間違いで、Pythonは、検出できるものについて教えるのが得意です。初心者は、赤いエラーを判決のように見ることがよくあります。実際には納品書に近いものです。何がおかしくなったか、何行目で、どの部分のコードでか。コツは、どこを見るかを知ることです。

トレースバックは下から上へ読む

total = 0
count = 0
print(total / count)
出力
Traceback (most recent call last):
  File "main.py", line 3, in <module>
    print(total / count)
          ~~~~~~^~~~~~~
ZeroDivisionError: division by zero
1、2、3の順に読みます。最後の行のエラーの種類とメッセージ、次にファイルと行番号、次にコードの印の付いた部分です。

最後の行から始めます。ZeroDivisionError: division by zeroは、エラーの種類と短い説明を示します。次にFileの行へ上がります。ファイル名(あなたのコンピュータではフォルダの完全なパスがここに現れますが、ここではmain.pyに短縮しています)と行番号、3です。その下の行がコードそのもので、Python 3.12は、失敗した正確な演算を、/の記号の下の^で示します。3つすべてを読んでから初めて、何かを変え始めましょう。エラーが関数の中で起きたときは、トレースバックがそこへ至る途中のすべての呼び出しを列挙し、いちばん下のFileの行が、ふつう最初に見るべきものです。

エラーふつうの原因例
SyntaxErrorその行は有効なPythonではない:括弧、コロン、引用符の不足print("hi"
IndentationErrorインデントの不足、またはそろっていないインデントされた行のない、if x > 1:
NameErrorまだ存在しない名前。たいていは打ち間違いpritn("hi")
TypeError間違った型への演算"Age: " + 15
ValueError型は正しいが、受け付けられない値int("abc")
IndexErrorリストや文字列の終わりを越えたインデックス[1, 2][2]
KeyError辞書にないキー{"a": 1}["b"]
ZeroDivisionErrorゼロで割る5 / 0

SyntaxErrorはほかとは違います。Pythonが実行前に見つけるので、1行目さえ実行されず、「Traceback」の見出しもありません。ほかのすべては、プログラムの実行中に起こり、前の行がすでに仕事をしたあとです。特定のエラーが予想できるときは、tryとexceptで捕まえられ、チュートリアルはエラーの章でこれを扱っています。Pythonはインデントされたブロックを試し、そのエラーが起きたら、止まる代わりにexceptブロックを実行します。

print("before")
n = int("abc")
print("after")
出力
before
Traceback (most recent call last):
  File "main.py", line 2, in <module>
    n = int("abc")
        ^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'abc'
text = "abc"
try:
    n = int(text)
except ValueError:
    n = 0
print(n)
出力
0

最も難しいバグは、メッセージをまったく出しません。論理エラーは、実行されて間違った答えを出力するプログラムで、ifの単元の、85にCを与えた採点プログラムのようなものです。Pythonは、あなたが何を意図したかを知ることができません。そのようなときは、トレース表に戻るか、各ステップで変数を示す一時的なprintの行を足し、バグが見つかったら取り除きます。

小さなプロジェクト:お小遣い帳

このプロジェクトは、ほぼすべての単元から何かを使います。支出の辞書、合計を返す関数、forループ、f文字列、ifです。入力して実行し、それから自分のものにしましょう。項目を変える、分類を足す、あるいは、1つの項目が小遣いの半分より高いときに警告を出す、などです。

def total(spent):
    t = 0
    for amount in spent.values():
        t += amount
    return t

allowance = 30000
spent = {"snacks": 4500, "bus card": 10000, "notebook": 2500}
used = total(spent)
left = allowance - used
for item, amount in spent.items():
    print(f"{item}: {amount} won")
print(f"Spent {used}, left {left}")
if left < 15000:
    print("Less than half left")
出力
snacks: 4500 won
bus card: 10000 won
notebook: 2500 won
Spent 17000, left 13000
Less than half left

変える前に、usedとleftのトレース表を書き、6,000ウォンの項目を足すと何が起きるかを予想しましょう。そのうえで、わざとデバッグします。defの行のあとのコロンを消し、spentを一度綴り間違え、usedをゼロで割ってみます。直す前に、それぞれのトレースバックを下から読みましょう。プログラムを壊して、また直せることが、このコースが育ててきた本当の力です。

トレースバックPythonのエラー報告。下から読む
SyntaxError無効なコード。実行前に見つかる
NameError存在しない名前。たいていは打ち間違い
TypeError間違った型の値への演算
ValueError型は正しいが、int("abc")のように受け付けられない値
論理エラーメッセージなしで実行されるが、答えが間違っている
try / exceptそのエラーが起きたとき、止まる代わりにexceptブロックを実行する
  1. トレースバックのどの行が、エラーの種類を示しますか。
    • 最初の行
    • Fileの行
    • 最後の行
    • ^の印のある行
  2. int("12a")はどのエラーを起こしますか。
    • TypeError
    • ValueError
    • NameError
    • SyntaxError
  3. pritn("hi")はどのエラーを起こしますか。
    • SyntaxError
    • NameError
    • TypeError
    • エラーなし
  4. プログラムが1行目を出力し、2行目でエラーで止まりました。原因ではありえないエラーの種類はどれですか。
    • SyntaxError
    • NameError
    • TypeError
    • ZeroDivisionError
  5. このコードは何を出力しますか。
    try:
        x = 10 / 0
    except ZeroDivisionError:
        x = -1
    print(x)
  6. これを実行すると何が起こりますか。
    print("start")
    print(5 / 0)
    print("end")
    • startとendを出力する
    • startを出力し、ZeroDivisionErrorで止まる
    • 何も出力する前にZeroDivisionErrorで止まる
    • start、inf、endを出力する
  7. プログラムがメッセージなしで実行されますが、間違った合計を出力します。これは何のエラーですか。
    • SyntaxError
    • 論理エラー
    • NameError
    • IndentationError
  8. このコードは何を出力しますか。
    spent = {"a": 4500, "b": 10000}
    print(30000 - sum(spent.values()))
  9. この小さなプログラムの行を、下の結果が出力されるように並べてください。
    出力
    80.0
  10. バグはどこですか。def avg(nums): return sum(nums) / len(nums)を、avg([])で呼びます。
    • 空のリストのsumはエラー
    • len([])は0なので、ゼロで割る
    • returnは割り算を含められない
    • バグはない
よくある間違い
  • 「エラーはメッセージが示す行にあるので、直すのもそこ。」 多くの場合そうですが、いつもではありません。関数の単元で、x = show_area(4, 3)のあとにx * 2を実行すると、x * 2の行でTypeErrorで止まりますが、本当の間違いは、returnであるべきだったshow_areaの中のprintです。示された行を読み、その値がどこから来たかを問いましょう。
  • 「すべてをtry/exceptで包めば、エラーは直る。」 隠すだけです。int(input())のValueErrorのように、予想される特定のエラーを捕まえ、意味のある方法で扱いましょう。
  • 「エラーメッセージがなければ、プログラムは正しい。」 論理エラーはメッセージを出さずに潜んでいます。答えをすでに知っている入力でテストし、空のリストや境界の年齢のような境界条件の場合も含めましょう。
先生からひとことエラーメッセージを、ふつうのものにしましょう。よい手順は、何かを直す前に、学習者が最後の行を声に出して読み、次に行番号を言い、次に^の印を指すことです。わざと壊したプログラム(SyntaxErrorを1つ、NameErrorを1つ、TypeErrorを1つ)は、手軽なウォームアップになります。韓国の中学校の情報科のカリキュラムは、デバッガで結果を分析し、誤りを直すことを求めています。IDLEには、Debugメニューに簡単なものがありますが、この水準では、printの行とトレース表が同じ仕事をします。お小遣い帳のプロジェクトは、次の基準、実生活の問題をプログラムで解くことに合い、クラスのおやつの予算や読書記録に作り替えられます。
ポイント
  • トレースバックは下から読む:エラーの種類、次にファイルと行、次に印の付いたコード。
  • SyntaxErrorは1行目が実行される前にプログラムを止め、ほかのエラーは途中で止める。
  • try/exceptは、予想されるエラーを扱う。
  • 論理エラーはメッセージを出さない。答えのわかっている入力で追ってテストする。
  • デバッグとは、メッセージが当たり前に感じられるまで、わざと壊して直すこと。
このコースの出典 (6)
  • Python Software Foundation, The Python Tutorial for Python 3.12 (docs.python.org/3.12/tutorial: 2 Using the Python Interpreter, 3 An Informal Introduction to Python (numbers, text, lists), 4 More Control Flow Tools (if, for, range, break and continue, defining functions, default argument values, 4.10 coding style: 4-space indentation), 5 Data Structures (list methods, 5.5 dictionaries, insertion order), 8 Errors and Exceptions (syntax errors, exceptions, reading the traceback, handling exceptions), 15 Floating-Point Arithmetic (0.1 + 0.2))
  • Built-in Functions (docs.python.org/3.12/library/functions.html: print, input, len, int, float, str, type, round (round half to even: round(0.5) and round(-0.5) are 0, round(1.5) is 2), range, sum, min, max, sorted)
  • Built-in Types (str methods upper, lower, replace, strip; dict.get; list.append, pop, remove, sort returning None)
  • General Python FAQ (docs.python.org/3.12/faq/general.html: Guido van Rossum began Python in the 1989 Christmas holidays, posted it to USENET in February 1991, named it after Monty Python's Flying Circus)
  • Curriculum for the Korean pages: 교육부 고시 제2022-33호 [별책 10] 정보과 교육과정 (PDF read 2026-10-19: 중학교 정보 [9정03-05] 리스트 등 데이터를 순차적으로 저장하는 구조, [9정03-06] 논리 연산과 중첩 제어 구조, [9정03-07] 함수 활용과 디버거로 오류 수정, [9정03-08] 실생활 문제를 프로그래밍으로 해결, 적용 시 고려 사항 「학생의 수준을 고려하여 적합한 프로그래밍 언어를 선정」; 고등학교 정보 [12정03-04] 자료형, [12정03-05] 표준입출력, [12정03-07] 제어 구조)
  • Bug story only: Smithsonian National Museum of American History, Log Book With Computer Bug, 1947, Harvard Mark II, "first actual case of bug being found", probably not Hopper's log book (americanhistory.si.edu/collections/object/nmah_334663, read 2026-10-19)

確認日: 2026-10-19