この記事のねらい
「エラーが出た。何を見ればいいの?」を無くします。
代表的なエラーの“名前・原因・対処”を表で素早く引けるようにし、最後に直し方の手順と未然防止もまとめました。
検索で見つけやすいキーワードも散りばめています(プログラミング エラー 種類 初心者 デバッグ など)。
目次
まずは全体像:エラーは大きく3系統だけ覚える
系統 | いつ起きる? | 代表例 | ざっくり原因 | 直し方の軸 |
---|---|---|---|---|
構文エラー(Syntax) | 実行前の解釈 (パース)時 | SyntaxError , Unexpected token | 文法ミス(カッコ抜け、コロン忘れなど) | エディタで該当行を修正。自動整形(formatter)で予防 |
実行時エラー(Runtime/例外) | 実行中の 特定の瞬間 | TypeError , ReferenceError , NameError , FileNotFoundError | 値や環境が想定外(存在しない、型が違う、権限なし等) | エラーメッセージとスタックトレースを読み、入力や前提条件を直す |
論理エラー(バグ) | 実行できるが 結果が変 | 無限ループ、誤計算、オフバイワン | 考え違い・条件式のミス・境界の理解不足 | テスト・出力の比較・最小再現で差分を特定 |
代表的なエラーの種類(早見表)
言語ごとに名前は少し違っても意味はほぼ共通です。
Python/JavaScript/Java/C系の初学者でよく出るものを中心に掲載。
種類(よく見る表記) | 典型メッセージ例 | よくある原因 | 見つけ方のコツ | すぐ試す対処 |
---|---|---|---|---|
SyntaxError / パースエラー | SyntaxError: invalid syntax / Unexpected token | 括弧/クォート閉じ忘れ、末尾カンマ、コロン忘れ | エラー行の直前も疑う(ズレやすい) | 自動整形(Prettier, Black等)→差分を見る |
ReferenceError / NameError | ReferenceError: x is not defined / NameError: name 'x' is not defined | 変数名のタイポ、スコープ外、宣言前使用 | まずスペル→宣言位置とスコープ確認 | 変数を先に宣言、引数で受け渡し |
TypeError | TypeError: x is not a function / unsupported operand type(s) | 型の取り違え(数値に文字列足す等) | 型をログ出力して事実確認 | 明示的に型変換、分岐で型チェック |
AttributeError / Property undefined | AttributeError: 'NoneType' object has no attribute / Cannot read properties of undefined | null/undefinedにアクセス | 対象が必ずある前提を崩す | 存在チェック (ガード節、オプショナルチェーン) |
IndexError / KeyError | list index out of range / KeyError: 'id' | 配列/辞書にない要素へアクセス | **長さ(length/len)**を先にログ | 範囲チェックget() やin で確認 |
ZeroDivisionError | division by zero | ユーザ入力や計算で0で割ったとき | 分母の事前検証 | 0のときの分岐 (早期return) |
FileNotFoundError / ENOENT | No such file or directory | パス間違い、相対パスの起点勘違い | 現在ディレクトリと実在確認 | 絶対パス化、存在チェック、権限確認 |
PermissionError / EACCES | Permission denied | 書き込み権限なし、管理者権限不要? | 実行ユーザと権限を確認 | 保存先変更、権限付与 |
ImportError / ModuleNotFound | No module named 'xxx' / Cannot find module | 依存の未インストール、仮想環境違い | 使用中の環境/パスを表示 | 再インストール、環境を統一 |
Timeout / NetworkError | ETIMEDOUT ECONNREFUSED | ネットワーク不調、API先の遅延 | リトライで再現性を見る | タイムアウト値/リトライ/バックオフ |
MemoryError / OutOfMemory | Killed / OutOf memory | 大きすぎる配列・無限生成 | 入力規模を縮小して比較 | 分割処理・ストリーミング |
論理エラー (オフバイワン) | 目に見えるエラー無し | ループの境界を1つズラす | 最小のケースで境界を検証 | <= /< の意図をコメントで固定 |
浮動小数点誤差 | 0.1 + 0.2 != 0.3 | 小数の二進表現誤差 | 期待値と誤差許容を設計 | 丸めor **整数(最小単位)**で扱う |
並行性/レース(入門外) | たまに壊れる | 共有データの同時書き込み | 再現が低頻度 | 排他・不変データ化 |
実例で理解:同じミスでも言語で出方が違う
1) 参照エラー(存在しない変数)
JavaScript
console.log(total); // ReferenceError: total is not defined
let price = 100;
Python
print(total) # NameError: name 'total' is not defined
price = 100
ポイント
- 宣言 or 代入の前に使っていないか?
- スコープ(関数の内外)をまたいでいないか?
2) 型エラー
JavaScript
const n = 10;
console.log(n.toFixed + 2); // TypeError: n.toFixed is not a function
Python
x = "10"
print(x + 2) # TypeError: can only concatenate str (not "int") to str
ポイント
- 型をログで確認(
console.log(typeof x)
/print(type(x))
) - 必要に応じて明示的に変換(
Number(x)
,int(x)
など)
3) Index/Keyエラー
Python
arr = [1,2,3]
print(arr[3]) # IndexError: list index out of range
user = {"name": "Alice"}
print(user["id"]) # KeyError: 'id'
対策
- 範囲前に
len(arr)
を確認 user.get("id")
で無ければNoneを返す安全アクセス
はじめてのデバッグ:5つの固定ルート
- エラーメッセージを“まるごと”読む
- 最初の1行=種類、その下=理由、スタックトレース=壊れた関数・行番号。
- “直前の変更”と“最小再現”
- 余計な処理を削ぎ落として10行前後まで小さく再現。原因が浮かび上がる。
- 値の事実確認(ログ)
- 変数の中身・型・配列長を出力して「思い込み」を排除。
- 境界・前提条件のチェック
null/undefined/None
、空配列、0割、ファイル有無、権限などをif文でガード。
- 公式ドキュメント/エラー名で検索
"TypeError: ..."
をコピペ検索。同名事例に当たり、原因と解が最短で見つかる。
症状→確認ポイント(逆引き表)
症状 | まず見る場所 | 追加でやること |
---|---|---|
“突然”壊れた | 直前の差分(Gitの変更) | 変更点だけで最小再現を作る |
ローカルOK・本番NG | 環境差(OS/Node/Python/権限/パス) | バージョン出力、絶対パスで固定 |
たまに失敗 | 非同期/ネットワーク/時間依存 | リトライ・待機・疑似負荷 |
計算だけおかしい | 境界と丸め | テストで境界値(0,1,MAX-1,MAX) |
長文のSyntaxError | 直前の括弧/クォート | 自動整形を走らせ差分で気づく |
エラーを減らす「仕込み」(未然防止)
施策 | 何が減る? | ツール/ヒント |
---|---|---|
Linter + Formatter | 構文/スタイルミス | ESLint/Prettier、Flake8/Black を保存時に自動実行 |
型の明示 | TypeError | TypeScript / Pythonのtyping で意図を型に残す |
入力バリデーション | Runtime全般 | Web/APIは必ず検証(必須・範囲・形式) |
例外ハンドリング | 予期せぬ落ち | try-catch / try-except でユーザ向けメッセージ |
小さなテスト | 論理エラー | 単体テスト+境界値(0、空、最大) |
ログの粒度設計 | 原因特定の速さ | INFO=流れ, DEBUG=値 を出す指針を決める |
環境の固定 | 依存/Import系 | requirements.txt / package-lock.json / 仮想環境 |
コピペで使える:例外ハンドリングの型(テンプレ)
JavaScript(Node/ブラウザ)
try {
const data = await fetchJson(url); // ここが落ちやすい
if (!data || !Array.isArray(data.items)) {
throw new Error("Unexpected response shape");
}
render(data.items);
} catch (err) {
console.error("[ERROR]", err.message);
alert("処理に失敗しました。時間をおいて再度お試しください。");
}
Python
from typing import Any
def safe_div(a: float, b: float) -> float | None:
try:
if b == 0:
return None
return a / b
except Exception as e:
print("[ERROR]", e)
return None
検索に強い“調べ方”フレーズ(即実務)
"<エラー名> <関数名またはライブラリ名> <言語>"
例:TypeError map is not a function JavaScript
"環境差 <OS/ランタイム> <エラー名>"
例:ModuleNotFoundError venv Windows
"再現手順 <要約>"
例:list index out of range when last element
よくある質問(FAQ)
Q1. Warnings(警告)は無視していい?
A. 基本は無視しない。将来エラー化・非推奨の合図。時間がなければ記録して後で対応。
Q2. どこから触ればいいか毎回迷います。
A. スタックトレースの末尾に近い自分のコードから。ライブラリ内部より自分の呼び出し側を直す。
Q3. 直せたと思ったら別の場所が壊れました。
A. 変更で副作用が出ています。テストとコミット粒度を小さくして影響範囲を管理。
Q4. 再現しない不具合はどう詰める?
A. ログを濃くして「起点→途中→失敗点」をつなぐ。入力サイズや時刻も記録。
Q5. 初心者がまず覚えるべき3つは?
A. Syntax / Reference(Name) / Type。この三兄弟を潰せると9割の“最初の壁”は越えられます。
まとめ:エラーメッセージは“敵じゃなく説明書”
- 構文・実行時・論理の3系統を意識する
- 種類→原因→対処を表で逆引きする
- 最小再現+ログ+境界チェックで迷子にならない
- Linter/Formatter・型・テストで未然に減らす
ポイント
この記事の表を自分の言語に合わせてチートシート化し、エディタに貼る。
“まず確認する3項目”(エラー名、行番号、直前の変更)を毎回声に出して確認しましょう。
継続は最強のデバッグ術です。
ここらをスクールでしっかり学びたいなら

とりあえず安くPythonを使えるようになりたい人は

しっかりPythonと周辺技術を学んで就職につなげたい人は

下地があるけど、しっかり学びたい。でも安い方がいい人は、ここのWebアプリ開発かPythonコースがオススメ。しっかり学べてお値段格安。
