英語のエラー文を読めるようになろう


プログラミングをしていると、エラーメッセージに遭遇することは避けられません。

しかし、エラーメッセージは英語で書かれていることが多く、「何を言っているのか分からない...」と悩んだ経験はありませんか？

とりあえずGoogle検索にそのままコピペしても、出てくるのは結局英語の記事ばかり...余計に混乱してしまう、なんてこともあるかと思います。エラーメッセージを正しく理解できるようになれば、デバッグのスピードが上がり、プログラミングの効率も大きく向上させることができるでしょう。

本記事では、プログラミングの初心者向けにエラー文読解に特化して、頻出単語や簡単な英文法について解説していきます。

よく見るエラー文のパターンや英単語、構造を覚えて、実際のエラー解決に役立つ知識を身につけましょう！

## エラーメッセージのパターン

エラーメッセージは英語で書かれていますが、基本的なパターンさえ押さえれば英語が苦手でも意味を推測しやすくなります。

多くの場合、下記３つの要素で構成されています。

1. エラーの種類
   - どんな種類のエラーなのか
2. エラーの内容
   - 何が問題となっているのか
3. エラーの発生個所
   - どのファイルでエラーが発生したのか
   - エラーが発生した行や列番号

実際にコンソール上で表示されるのは下記のような形式です。

```shell
[エラーの種類]: [エラーの内容]
    at [発生ファイル名]:[発生した行]
```

プログラミング言語によって種類や記載される順番に違いがあるものの、殆どのエラーメッセージはこのパターンに当てはまります。

これから実際のエラーメッセージを例に、解説と共に読み解いていきましょう。

## 実際のエラーメッセージを分解してみる

```shell
TypeError: Cannot read properties of undefined (reading 'name')
    at Object.<anonymous> (app.js:12:10)
```

上記はJavaScriptで発生したエラーメッセージの例です。日本語が１つも見当たりませんね...

単語の意味や文法については後述するので、まずは先程紹介したパターンに合わせて分解してみましょう！

1. TypeError
   - コロン（：）で区切られていて目立つこの部分がエラーの種類です。Errorと書いてあるのでエラーであることは間違いなさそうです
2. Cannot read properties of undefined (reading 'name')
   - エラーの内容っぽいです。括弧で補足情報も記載してくれているようです
3. at Object.`<anonymous>` (app.js:12:10)
   - エラーの発生個所です。app.jsがファイル名っぽいですね

パターンに合わせて分解ができたところで、順番に紐解いていきましょう。

### エラーの種類について

今回の例では「TypeError」という種類のエラーであることを示しています。これらエラーの種類や名前は各プログラミング言語によって異なりますが、殆どの場合「**〇〇Error**」や「**〇〇Exception**」と書いてあります。

| 英単語名  | 読み方         | 意味                       |
| --------- | -------------- | -------------------------- |
| Error     | エラー         | 失敗・誤り                 |
| Exception | エクセプション | 例外・原則に当てはまらない |

そして種類である「TypeError」の「**Type**」は「型」の事を指します。

「あたし、あの人のこと超タイプなんだよね～～」という会話をよく聞きませんか？これは自身が好きな属性、つまりは好きな型の人であることからタイプという言葉を使っているのですね！

プログラミング言語もデータに対して型という概念がありますので、そこが関わっていると予想することができます。

| 英単語名 | 読み方 | 意味 |
| -------- | ------ | ---- |
| Type     | タイプ | 型   |



### エラーの内容について

エラーの種類とは違い、普通に英文が現れました。正念場です。左から読んでいきましょう。

◆**Cannot** read properties of undefined (reading 'name')

「**Cannot**」というのは、「〇〇することが可能である」という意味を持つ「**Can**」という言葉に、否定を表す「not」がくっついた単語です。つまり「Cannot」は「可能」を否定するので「不可能」という意味になります。省略形で「Can't」と書く場合もあり、意味は同じですが少しカジュアルな言い回しの表現です。

| 英単語名        | 読み方                    | 意味   |
| --------------- | ------------------------- | ------ |
| Can             | キャン                    | 可能   |
| Cannot（Can't） | キャンノット（キャ-ント） | 不可能 |

◆Cannot **read** properties of undefined (reading 'name')

では何をすることが不可能なのでしょうか。それが次の単語「**Read**」ですね。「Read」は「読む」という意味の単語です。「本を読む」「文章を読む」などの読むにあたりますが、実は「読んで'理解する'」というところまで意味に含まれています。プログラミングの文脈では、「ファイルやデータを読み取る・アクセスする」という意味で使われます。

なので、1つ前の「Cannot」と合わせると「Cannot read」で「読み取ることが不可能」という意味になります。

| 英単語名 | 読み方 | 意味     |
| -------- | ------ | -------- |
| Read     | リード | 読み取る |

◆Cannot read **properties** of undefined (reading 'name')

一体何を読み取ることが不可能なのか、それが 「**Properties**」 です。「**Properties**」 は「属性」や「性質」を意味する*「**Property**」 の複数形です。

英語では、対象が **1つ（単数形）か、2つ以上（複数形）かを厳密に区別する** ため、ここでは 複数形の **properties** が使われています。また、JavaScript のエラーメッセージでは `Cannot read properties of undefined` のように **複数形が使われるのが一般的** ですが、これは **「どのプロパティが読まれようとしているのかが特定されていない」** ためです。プログラミングの文脈では **「オブジェクトのプロパティ（データやメソッド）」** を指すことが一般的です。

これまでの文の意味と合わせると、「**オブジェクトのプロパティを読み取ることが不可能である**」と理解することができます。

| 英単語名               | 読み方                       | 意味       |
| ---------------------- | ---------------------------- | ---------- |
| Property（Properties） | プロパティ（プロパティーズ） | 属性・性質 |

◆Cannot read properties **of** **undefined** (reading 'name')

今回は後の単語に意味が連なるので２つ続けて紹介します。

**「Of」**は 「～の」「～に属する」  という意味を持ち、所有や帰属性を表す単語です。一般的な使い方として「BのA」「BというA」といった表現になります。

例：

1. A piece **of** cake
   - Cake（ケーキ）に対してその中のPiece（１切れ）、つまりケーキ１切れを表す
2. The member **of** tennis club
   - Tennis club（テニス部）に所属しているMember（メンバー）であるため「テニス部員」を表す
3. The city **of** Tokyo
   - Tokyo（東京）に属するCity（街）は東京を含む街全体を表すので、日本語的には「東京という街」と訳される

> ※日本語の表現幅が広いため「ケーキ１切れ」は「１切れのケーキ」とも言い換えれる。必ずしも「BのA」という訳し方にならない。「Of」はあくまで対象の帰属がどこにあるかを表している

次の「**Undefined**」は「定義する」という意味の単語「Define」の過去分詞「**Defined（定義された）**」に、さらに性質を否定する「**Un**」がくっついた単語です。つまり「定義されていない・未定義」という意味になります。JavaScriptでは、変数やデータが定義されていない場合に undefined という特別な値が割り当てられます。これは null や「空」と近い概念ですが、異なる型として扱われます。そのため、変数が undefined の状態でプロパティにアクセスしようとすると、エラーが発生します。

「Of」の話に戻して「A of B」の形式に合わせると、今回のエラー文の「Properties」がAで、「Undefined」がBになるため、「Undefinedに属するProperties」転じて「**未定義のプロパティ**」という意味になります。

ここまで読み解いた意味を合わせると、「**未定義のプロパティを読み取ることが不可能である**」という内容のエラーメッセージであることがわかります。ここで重要なのは undefinedはオブジェクトではないため、プロパティを持つことができないという点です。プロパティを持つことができないundefined型のプロパティを読み取ろうとしているのでエラーが発生しているという原因が浮かび上がってきます。

| 英単語名  | 読み方             | 意味                     |
| --------- | ------------------ | ------------------------ |
| Of        | オブ               | ～の・～に属する         |
| Undefined | アンディファインド | 未定義・定義されていない |

◆Cannot read properties of undefined **(reading 'name')**

最後に、括弧で囲まれた情報について説明します。ここには「**Reading**」という単語が含まれていますね。

すでに学んだ「Read（読む）」の派生形で、「Reading」は現在進行形と呼ばれる形です。英語では動詞に「-ing」をつけることで「～している（進行中の動作）」を表すことができます。つまり、reading 'name' は「'name' を読み取っている最中」という意味になります。

そして、エラーメッセージの前半部分「Cannot read properties of undefined」から、「未定義の値 (undefined) にプロパティnameが存在しないため、読み取れない」状態であることが分かります。

この括弧内の情報によって、「**今回 undefined から読み取ろうとしたプロパティが name であった**」ということが明示されているわけです。



### エラーの発生個所について

◆at Object.`<anonymous>`(app.js:12:10)

「**At**」はその後に続くものの場所や時間など、広い範囲の中の1点を指し示す単語です。日本語ではよく「〇〇で」と訳されることが多く、例えば「At school」であれば「学校で（学校という地点で）」、「At seven」であれば「7歳の時に（7歳時点で）」という意味になります。

今回のエラーメッセージでは、エラーが発生した特定の「**場所**」を示しています。対象は「Object`<anonymous>`」と括弧で補足された「app/js:12:10」です。

「Object`<anonymous>`」は**JavaScript特有の表記**であり、「無名関数」の内部でエラーが発生したことを意味しています。JavaScriptでは関数に名前をつけず定義することができ、これを無名関数といいます。

「app.js:12:10」はそのまま、ファイル名と行と桁です。どのファイルのどこでエラーが発生したかが記載されています、今回の例文では「app.js」というファイルの12行目10桁目でエラーが発生したことがわかります。

| 英単語    | 読み方     | 意味               |
| --------- | ---------- | ------------------ |
| At        | アット     | ～で               |
| Anonymous | アノニマス | 匿名の・名前のない |



### 全て繋げて日本語訳

```shell
TypeError: Cannot read properties of undefined (reading 'name')
    at Object.<anonymous> (app.js:12:10)
```

上記エラーメッセージを要素と単語別に分解してみた内容で全てつなげると下記のようになります。

```sh
型に関わるエラー：未定義のプロパティを読み取ることが不可能。（nameというデータを読み取り中）無名関数内で（app.jsの12行目10列目）
```

日本語の文章として整えると、

**app.jsの12行目10列目の無名関数内で、nameというデータを読み取ろうとしたが、プロパティが未定義であるため読み取ることが不可能である。**

というメッセージであることがわかります。

このように、エラーメッセージを読むことでエラーの発生原因を明確に理解できるようになりますコードの該当箇所をすぐに確認し、調査や修正作業へスムーズに移行するためにも、エラーメッセージと真摯に向き合っていくことが大切です。

## 他のプログラミング言語のエラーメッセージ

JavaScriptのエラーメッセージを例に要素の分解と読解ができたところで、今度は他の言語のエラーメッセージ例もみてみましょう。

新しい単語も登場するので、演習問題を解く気持ちで挑戦してみてください！

### エラーメッセージ例１：PHP

```sh
Fatal error: Call to undefined function getData() in /var/www/html/index.php on line 12
```

| 英単語   | 読み方         | 意味                           |
| -------- | -------------- | ------------------------------ |
| Fatal    | フェ-タル      | 致命的な                       |
| Call     | コール         | 呼ぶ・呼び出す                 |
| To       | トゥ-          | ～に・～へ・右矢印のような役割 |
| Function | ファンクション | 関数                           |
| In       | イン           | ～の中で                       |
| On       | オン           | ～の上で                       |
| Line     | ライン         | 行                             |

#### 要素単位に分解

1. エラーの種類
   - Fatal error
2. エラーの内容
   - Call to undefined function getData()
3. エラーの発生個所
   - in /var/www/html/index.php on line 12

#### 解説

少し表現は異なりますが、JavaScriptのエラーメッセージ例とほぼ同じです。

今回のメッセージ内容で難しい単語は「**To**」でしょうか。「To」は日本語で「～に」と訳されることが多いのですが、英語としての感覚は「To」に続く単語に対して右矢印を置いて注目させているようなイメージです。「**A to B**」は「**A → B**」のようなニュアンスです。例では「呼ぶ」という意味の「Call」から始まり「A to B」の形式に合わせると、「**Call → undefined function getData()**」となります。

「undefined」はJavaScriptの例でも出てきた通り、「未定義の」という意味になり、そのまま「function（関数）」とプログラミング上での関数名である「getData()」を合わせて「**未定義の関数 getData()」という意味になります。

エラーの発生個所と合わせると、「**/var/www/html/index.php上の12行目の中で、未定義の関数getData()を呼び出す**」ということが「**致命的なエラー**」であると理解することができます。

### エラーメッセージ例２：PHP

```sh
Parse error: syntax error, unexpected ';' in index.php on line 5
```

| 英単語       | 読み方               | 意味                                     |
| ------------ | -------------------- | ---------------------------------------- |
| Parse        | パース               | 解析する                                 |
| Syntax       | シンタックス         | 構文・文法                               |
| Expect       | エクスペクト         | 期待する・予期する                       |
| - Expected   | エクスペクテッド     | Expectの過去分詞。期待される・予期される |
| - Unexpected | アンエクスペクテッド | Expectedを否定。期待されていない・予想外 |

#### 要素単位に分解

1. エラーの種類
   - Parse error
2. エラーの内容
   - syntax error, unexpected ';'
3. エラーの発生個所
   - in index.php on line 5

#### 解説

今回登場した「Unexpected」もプログラミングのエラーメッセージの中では頻出単語です。それ以外はここまでの例や解説の中で既出のものばかりなので、理解が容易かと思います。

今回は、「**index.phpの5行目の中で、文法エラー、予想外の'；'がある**」という「**プログラムの解析エラー**」であると理解することができます。

### エラーメッセージ例３：Ruby

```sh
SyntaxError: unexpected end-of-input, expecting `end'
```

| 英単語 | 読み方     | 意味               |
| ------ | ---------- | ------------------ |
| End    | エンド     | 最後・終わり・終端 |
| Input  | インプット | 入力               |

#### 要素単位に分解

1. エラーの種類
   - SyntaxError
2. エラーの内容
   - unexpected end-of-input, expecting `end'
3. エラーの発生個所
   - 記載なし

#### 解説

発生個所の記載がないパターンです。エラーの種類がSyntaxErrorなので、プログラムの文法自体に誤りがあると推測できます。

「Unexpected」の対象は「end-of-input」で、その後にある「expecting 'end'」から、期待していたのはendであることがわかります。

「Of」の用法である「A of B」の通り、「end-of-input」は「入力の終端」を意味さすので、「**入力の終端がendだと期待していたがそうではなかった**」という意味の文となります。

Rubyではif文や関数定義のあと、その一連の処理の終わりにendと記載する必要があります。これが存在しないため文法エラーが発生していることを表しています。

### エラーメッセージ例４：Java

```sh
Exception in thread "main" java.lang.NullPointerException
    at Main.main(Main.java:5)
```

| 英単語 | 読み方   | 意味                                                         |
| ------ | -------- | ------------------------------------------------------------ |
| Thread | スレッド | 筋　/　１つの処理フロー・プログラム内で実行される最小単位のまとまり |

#### 要素単位に分解

1. エラーの種類
   - java.lang.NullPointerException
2. エラーの内容
   - Exception in thread "main"
3. エラーの発生個所
   - at Main.main(Main.java:5)

エラーメッセージの３要素はありますが、順番が違う例です。今回のエラーではJava特有の「**java.lang.NullPointerException**」がエラーの種類に当てはまります。「NullPointerException」は、インターネットスラングとして有名な「ぬるぽ」の語源で、存在しない（null）に対してデータのアクセスをしようとした際に発生します。

それ以外は他のエラー文と同様に理解することができるかと思います。

## その他頻出単語

今回の例文に出てこなかったが、よくでてくる単語一覧です。

| 英単語    | 読み方       | 意味                                        |
| --------- | ------------ | ------------------------------------------- |
| Reference | リファレンス | 参照（変数の参照など）                      |
| Range     | レンジ       | 範囲                                        |
| Config    | コンフィグ   | 構成・設定が記述されたファイル              |
| Find      | ファインド   | 見つける                                    |
| Found     | ファウンド   | Findの過去/過去分詞。見つけた・見つけられた |
| Method    | メソッド     | 方式・プログラミングにおけるメソッド        |
| Indent    | インデント   | へこみ・文字入力におけるインデント          |
| Empty     | エンプティ   | 空（から）                                  |
| Support   | サポート     | 支援・援助・対応                            |

## おわりに

いかがでしたでしょうか？

この記事を読む前よりもエラーメッセージに対する抵抗が下がって、かつ解像度が上がっていたら幸いです。

エラーメッセージが表示されても焦らず、まず何を伝えようとしているか読み解いてあげることを心がけましょう

また、弊社では入社された未経験エンジニアの方に対し、本記事のような粒度で教育・研修を行っております。
随時採用も行っておりますので、お気軽にご応募ください！