【Python】エラーメッセージの内容を理解する

#### 背景

自身がPython習得をすすめる上での備忘録ではありますが、エラーメッセージの読み解き方を、ここにまとめておきます。

- 第二弾　[【Python】エラーメッセージの内容を理解する（２）](https://qiita.com/_whitecat_22/items/beb3db70f582001e3ce3)

先人たちの知恵をお借りするなどして解決できたことを、この場をお借りして感謝するとともに、大変恐縮ですが自分のメモとしても、こちらへまとめておきます。

#### 開発環境

- Windows 10 Pro
- Python 3.9.0, 3.8.5
- Django 3.1.3
- PostgreSQL 13.1
- Nginx 1.19.5
- Gunicorn
- Putty 0.74

# エラーメッセージ

## 1. NameError
#### 1-1.

- ミス・タイピングによって起こる。大文字・小文字の違いでも起こる。

```python:python
prlnt("Hello World !")    # 誤...print→prlnt

print("Hello World !")    # 正
```

```:ターミナル
Traceback (most resent call last):
    file "c:/～/sample.py", line 1, in <module>
        prlnt("Hello World !")
NameError: name 'Prlnt' is not defined
```

【訳】
直近の最後の呼び出しにおけるモジュール内での名前エラーが発生：1行目の「pilnt」という名前は定義されていません。
　↓
**『スペルミスをしてるよ～！』**ということ。

#### 1-2. 

- 関数の呼び出しが、関数定義よりも前で行われている場合に起こる。

```python:python
print(cost(100000))        # 誤...costを定義よりも前で、呼び出している

def cost(bill):
    return int(bill * 1.1)
```

```:ターミナル
NameError: name 'cost' id not defined
```

【訳】
NameErrorが発生：「cost」は定義されていません。
　↓
**『「cost」という関数は、まだ把握・理解していないよ～』**ということ。


## 2. SyntaxError

- 文法に関するミスで起こる。

#### 2-1.

```python:python
print("Hello World !)     # 誤...閉じクォート忘れ

print("Hello World !")    # 正
```

```:ターミナル
SyntaxError: EOL while scaning stringliteral
```

【訳】
SyntaxErrorが発生：文字列リテラルの走査中に行末（End Of Line）を見付けました。
　↓
**『文字列だと思ってたのに、行末になっちゃったけど！？大丈夫？』**ということ。

#### 2-2.

```python:python
print( Hello World ! )    # 誤...クォート忘れ

print("Hello World !")    # 正
```

```:ターミナル
SyntaxError: invalid character in identifier
```

【訳】
SyntaxErrorが発生：識別子の中に不正な文字を見付けました。
　↓
**『（クォートで囲んでないから）変数か、関数だろうと思ったけど、「!」って使っちゃダメ～』**ということ。

＜注＞
「!」（エクスクラメーション・マーク）は、変数や関数の名前として使えない文字です。このために不正な文字と指摘されています。

#### 2-3.

```python:python
ifheight > 180:     # 誤...ifの直後に半角スペースが無い

if height > 180:    # 正
```

```:ターミナル
SyntaxError: invalid systax
```

【訳】
SyntaxErrorが発生：不正な文法です。
　↓
**『そんな書き方じゃダメで～す』**ということ。


## 3. TypeError

- データの型に問題があるときに起こる。

```python:python
print(5 + "枚")        # 誤...5(数値)と、"枚"(文字列)を、＋演算子で結合しようとしたが、方が異なるため連結できない

print("5" + "枚")      # 正...型をstr型に合わせる
print(str(5) + "枚")   # 正...同上
```

```:ターミナル
TypeError: unsupported operand type(s) for +: 'int' and 'str'
```

【訳】
TypeErrorが発生：＋演算子は被演算子の型を支持していません。
　↓
**『データの型が、intとstrとで異なるから一緒に処理できないよ～』**ということ。

## 4. IndentaionError

- ifやfor文、関数などのネストのインデントが無かったり、ズレていたりすると起こる。

```python:python
if counter > 10:
break               # 誤...インデントが無い

if counter > 10:
    break           # 正
```

```:ターミナル
IndentationError: expected an indented block
```

【訳】
IndentationErrorが発生：インデントされたブロックが必要だと予測します。
　↓
**『インデントしていないけど、インデントが必要だよねぇ～』**ということ。

※逆の場合（インデントが不要なのに、インデントしている場合）も、同様にIndentationErrorとなります。


## 5. ValueError

- 演算子や関数が、**正しい型だが適切でない値**を持つ引数を受け取ったときや、 IndexError のような、より詳細な例外では記述できない状況で起こる。


```python:python
print(int('xxxxxxx'))
```

```:ターミナル
ValueError: invalid literal for int() with base 10: 'xxxxxxx'
```

【訳】
ValueError：引数baseが10であるint関数に対して、不正なリテラル：文字列「xxxxxxx」です。
　↓
**『10進数に変換できない「xxxxxxx」という文字列を入れてますよ～！』**ということ。

※int関数は、第二引数に、baseという引数を指定することが可能。引数baseは基数を表します。省略した場合はデフォルト値:10が与えられます。
　「with base 10」＝『基数を10に指定（＝10進数へ変換する）』ことを表します。


## 6. ModuleNotFoundError

- モジュールをimportできない場合に起こる。（主にタイプ・ミスによる）

```python:python
import xxxxxxxx
```

```:ターミナル
ModuleNotFoundError: No module named 'xxxxxxxx'    # 「xxxxxxxx」というモジュール名が見付からない
```

【訳】
モジュールが見付からないエラーが発生：「xxxxxxxx」という名前のモジュールがありません。
　↓
**『「xxxxxxxx」って名前のモジュールなんて、ありまへんっ！』**ということ。


## 7. ZeroDivisionError

- いわゆる「ゼロ割り」した場合に起こる

```python:python
10 + 10 + 10 + 10 * 0 + 10 + 10 / 0 + 10
```

```:ターミナル
ZeroDivisionError: division by zero
```

【訳】
ZeroDivisionErrorが発生：ゼロで割り算しました。
　↓
（そのまま）**『ゼロ割りじゃん！』**ということ。


## 8. KeyboardInterrupt

- 実行中に割り込みキー（「ctrl」＋「C」キー等）を押下すると起こる。（無限ループを止める際等）

```:ターミナル
Traceback (most resent call last):
    file "c:/～/sample.py", line 120, in <module>
        counter += 1
KeyboardInterruput
```

【訳】
キーボードからの割り込みが入りました。
　↓
**『キーボードから割り込みキーが入力されたよ！』**ということ。


---
#### (編集後記)

よく遭遇するエラーを集めてまとめてみました。
まずは簡単なエラーの内容、原因・理由を理解して、複雑なプログラミングをする際に、エラーが出ても慌てないようにしたいですね。

VS Code には、リアルタイムに文法をチェックしてくれる拡張機能もあるようですので、いろいろ試してみようと思います。