プログラミング初心者がエラーメッセージを自力で読んで解決する方法【3つの原則】

プログラミング基礎

プログラミング 初心者がエラーメッセージを見た瞬間に思考停止してしまうのはよくあることです。赤い文字の英語が大量に表示されると、多くの人はパニックになり、エラー文をそのままコピーして検索エンジンに投げるか、解決を諦めてしまいます。しかし、エラーメッセージには「あなたのコードのどこが、なぜ動かないのか」という答えが書かれています。この記事では、エラーメッセージを自力で読んで解決するための3つの普遍的な原則を解説します。

この記事でわかること

  • エラーメッセージが「親切な診断結果」である理由
  • エラーを読む3つの原則(動詞を探す・ファイル名を探す・上から読む)
  • PythonとJavaScriptの具体的なエラー例と読み解き方

エラーメッセージは「敵」ではなく「診断結果」

エラーメッセージは、コンパイラやインタープリタがあなたのコードを解析し、問題を検知したときに出力する診断結果です。医者が患者に病名と原因を伝えるように、システムはエラーメッセージを通じて「何が、どこで、なぜ起きたか」を伝えています。

エラーメッセージを見て検索エンジンに丸投げするのではなく、まず自分でメッセージを読む習慣をつけることが、エンジニアとして自立するための最初の一歩です。

原則1:「動詞を含む短い文」を探す

エラーメッセージの中に、動詞を含む短い一文があります。その一文には「システムが何をしようとして、何に失敗したか」が書かれています。まずその一文を見つけることが解決への最短経路です。

以下はPythonでよく見るエラーです。

Traceback (most recent call last):
  File "app.py", line 12, in <module>
    result = divide(10, 0)
  File "app.py", line 5, in divide
    return a / b
ZeroDivisionError: division by zero

このエラーで動詞を含む短い文は最後の行 division by zero(ゼロ除算)です。「0で割り算しようとした」というアクションが失敗したことが一行で伝わります。エラーの種類(ZeroDivisionError)と合わせて読むと、「ゼロ除算エラー:0による割り算」と即座に原因を特定できます。

ポイント

エラーメッセージの末尾にある「エラー種別:短い説明文」の形式が最も重要な情報です。まずここを読んでください。

原則2:「ファイル名」が書いてある箇所を特定する

エラーメッセージの中にファイル名(.py.js.rbなど)と行番号が書かれている箇所があります。これがエラーの発生源です。

先ほどのPythonのエラーを再度確認します。

  File "app.py", line 12, in <module>
    result = divide(10, 0)
  File "app.py", line 5, in divide
    return a / b

File "app.py", line 5 と書かれています。app.pyの5行目に問題の根源があることを示しています。エディタでその行を開くと、return a / b という割り算の処理が見つかります。引数 b に0が渡されているのが原因です。

JavaScriptでも同様です。

ReferenceError: userName is not defined
    at greet (app.js:8:18)
    at app.js:12:1

app.js:8:18 は「app.jsの8行目18文字目」を意味します。greet関数の中の8行目で、userNameという変数が定義されていないまま使われていることがわかります。

注意

ファイル名と行番号は必ずエディタで開いて確認してください。行番号なしに「どこを直すか」を特定することはできません。

原則3:長いエラーメッセージは「上から順番に」読む

スタックトレース(複数行にわたるエラー出力)が表示されると、初学者は下から読もうとする傾向があります。しかし、正しい読み方は上から順番に読むことです。

Pythonの Traceback (most recent call last): という表記は「直近の呼び出しが最後に表示される」という意味です。上の行ほど「最初に実行された処理」、下の行ほど「エラーが実際に発生した処理」を示しています。

# app.py
def divide(a, b):
    return a / b       # line 5:ここで実際にエラーが発生

def calculate():
    result = divide(10, 0)  # line 9:divide()を呼び出した場所
    return result

calculate()            # line 12:calculate()を呼び出した場所

スタックトレースを上から追うと、「calculate()が呼ばれ → divide(10, 0)が呼ばれ → a / bでゼロ除算が起きた」という実行の流れが読み取れます。この流れを把握することで、どこで間違った値(0)が渡されているかを特定できます。

3つの原則をまとめて実践する

以下のJavaScriptのエラーを使って3つの原則を一度に実践します。

TypeError: Cannot read properties of undefined (reading 'name')
    at displayUser (user.js:15:28)
    at main (app.js:32:3)
    at app.js:45:1
  1. 動詞を含む短い文を探す

    Cannot read properties of undefined(undefinedのプロパティを読み取れない)が該当します。「undefinedになっているオブジェクトのプロパティを読もうとした」とわかります。

  2. ファイル名を特定する

    user.js:15:28 が発生源です。user.jsの15行目を確認します。

  3. 上から読む

    app.js:45app.js:32main関数内)→ user.js:15displayUser関数内)という実行の流れがわかります。mainから渡されたデータがundefinedになっている可能性が高いと推測できます。

まとめ

  • エラーメッセージの末尾にある「エラー種別:動詞を含む短い説明文」を最初に読む
  • ファイル名と行番号を必ず確認し、エディタで該当箇所を開く
  • スタックトレースは上から順番に読み、処理の流れを追う

シリーズナビゲーション:脱・初学者サバイバルガイド

関連記事

コメント

タイトルとURLをコピーしました