Pythonでエラーが出た時、まずやること

## はじめに
プログラミングにおいて、エラーとの戦いは付き物です。特に最初のうちは、基本的な構文エラーで止まってしまうことが多くあります。このようなエラーを自分で解決できるようになるために、エラーが起きた時にすることをまとめてみました。

### 想定読者
Pythonで初めてプログラミングに触れる方
すでに環境は整っているものとします。

### 環境
- VisualStudioCode
- Python3.9
- JupyterNotebook(VSCode版)


## 1. エラーメッセージを読む
ほとんどのプログラミング言語では、実行時に想定と異なる状況が起きた時エラーが出るようになっています。
(C言語などではその一段階前のコンパイル時にエラーが出る場合もあります)

Pythonでは読みやすいエラーメッセージが出てくるので、読んでみましょう。

### よくあるエラー

#### IndexError

リストなどのインデックスがリストの長さを超えてしまった時に出るエラーです。

リストの長さが10のとき、インデックスは0~9の範囲でなければならないことに注意してください。

```python
points = [90, 80, 50]

for i in range(4):
    print(points[i])
    
#----- 出力 -----
90
80
50
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
/var/folders/mk/4l2s4ftj18sgrl6l79zdx1p40000gn/T/ipykernel_8747/2790366349.py in <module>
      2 
      3 for i in range(4):
----> 4     print(points[i])  # <- エラーが出た場所を詳しく教えてくれます

IndexError: list index out of range
```

#### KeyError

`IndexError`と同じように、あるディクショナリに、存在しないキーでアクセスした時に起きるエラーです。

```python
points = {"Alice": 90, "Bob": 85}

print(points["Carol"])

#----- 出力 -----
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
/var/folders/mk/4l2s4ftj18sgrl6l79zdx1p40000gn/T/ipykernel_8747/2731939624.py in <module>
      1 points = {"Alice": 90, "Bob": 85}
      2 
----> 3 print(points["Carol"])

KeyError: 'Carol'
```

#### NameError

変数名が存在しない場合のエラーです。タイプミスや、ローカル変数にアクセスしようとした時などに発生します。

[ローカル変数とグローバル変数について詳しく](https://pasopet.com/python_global_variable)

```python
def add(a, b):
    result = a + b

add(1, 2)
print(result)

#----- 出力 -----
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/var/folders/mk/4l2s4ftj18sgrl6l79zdx1p40000gn/T/ipykernel_8747/2211533763.py in <module>
      3 
      4 add(1, 2)
----> 5 print(result)

NameError: name 'result' is not defined
```



## 2. 検索する

これがメインと言っても過言では無いです。最強のプログラミングスキルだと思います。

### エラーメッセージで検索する

検索するとき、`Python リスト エラー`と`Python IndexError: list index out of range`

とでは、得られる情報の質が全く違います。なるべく具体的になるようにキーワードを絞りましょう。

基本的には、**エラーメッセージをコピペ**で大丈夫です。

```python
print = 30
print("上書きしました")

#----- 出力 -----
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/var/folders/mk/4l2s4ftj18sgrl6l79zdx1p40000gn/T/ipykernel_8747/328976122.py in <module>
      1 print = 30
      2 
----> 3 print("上書きしました")

TypeError: 'int' object is not callable  # <- この行を検索しよう
```

 たとえばこのようなエラーが出た場合、最後の行を検索してみましょう。上の方に[このような](https://tokkunchu.blogspot.com/2018/07/type-error-int-object-is-not-callable.html)サイトが出てくるはずです。Pythonのエラーは最後の行に情報が端的にまとまっているので、この部分を検索するのが一番効率がいい気がします。

場合によっては、複数の言語で似たようなエラーが出る場合があるのでキーワードに`Python`と入れておくと安心です。



### 抽象度を高める

さっきと矛盾しているようですが、時にはより抽象的に検索をする必要もあります。

例えば先ほどの例で、

```python
TypeError                                 Traceback (most recent call last)
/var/folders/mk/4l2s4ftj18sgrl6l79zdx1p40000gn/T/ipykernel_8747/328976122.py in <module>
```

この部分を検索した場合どうなるでしょうか。おそらく具体的な解決法は得られないと思います。

`/var/folders/mk/4l2s4ftj18sgrl6l79zdx1p40000gn/T/ipykernel_8747/328976122.py`

この部分は実行しているPythonの[パス](https://wa3.i-3-i.info/word1166.html)であるので、実行する人によって異なります。このように環境に依存する文字列を含んだ検索は避けた方がいいでしょう。

### 英語に臆さない

基本的には英語の方が実例が多いので頑張って読みましょう!


---
検索について詳しくはこれらのリンクを参考にしてください。

[検索力を上げて技術力を鍛える](https://qiita.com/ktr1211/items/b2cd6bc6b6dab3489ddf)

[Pythonの基本的なエラー一覧とその原因の確認方法](https://note.nkmk.me/python-error-message/)



## 3. 人に聞く

最終手段です。ほとんどの場合解決すると思われます。

$\downarrow$こちらを参考にしてください。15分は自分で調べてみましょう。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Googleの人工開発チームが提唱した「15分ルール」を解説<br><br>過去に出てたりするネタですが概要だけだと実際に何するのか分かりにくいと思ったので、経験を踏まえたアクションポイント入れてます。<br>参考程度に。<a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%88%9D%E5%BF%83%E8%80%85?src=hash&amp;ref_src=twsrc%5Etfw">#プログラミング初心者</a> <a href="https://t.co/Q8Rw6WdxOq">pic.twitter.com/Q8Rw6WdxOq</a></p>&mdash; たみおん｜Web制作脱初心者の学びを発信 (@baka_engineer) <a href="https://twitter.com/baka_engineer/status/1444603132554530819?ref_src=twsrc%5Etfw">October 3, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### 直接人に聞く

身近に強い人がいたら積極的に聞いていきましょう。

### Webサイトで聞く

身近にそのような人がいない場合、web上の質問サービスで聞くのも一つです。Yahoo知恵袋などでも良いですが、プログラミングに特化したサイトもあります。

- [Teratail](https://teratail.com/)

- [Qiita 質問機能](https://qiita.com/question-trend)

- [StackOverflow](https://ja.stackoverflow.com/) $\leftarrow$あまり初心者向きでは無いかもしれません

個人情報を出してしまわないように気をつけましょう。特にPathを貼り付ける時には自分の本名がついていることがあります。



## 終わりに

よいプログラミングライフを。