Python：良く発生するエラー8選

こんにちは。Shinです。
今日はPythonで良く見かけるエラーの種類についてお話したいと思います。

Pythonでコードを作成しているとエラーは頻繁に発生するため、慌てずにコンソールに表示される案内文に従って「何らかのエラーが出たんだな」「このような処理をすればいいんだ」と考えて対応できればと思います。


◆　目次
１．Python ValueError
２．Python SyntaxError
３．Python TypeError
４．Python IndexError
５．Python NameError
６．Python FileNotFoundError
７．Python ZeroDivisionError
８．Python AttributeError
９．Python その他エラーを確認できる場所


<body>
<h1>１．Python ValueError</h1>

よく、"参照値がないときに発生するエラー"と言います。 もう少し詳しく入ると、"引数に不適切な値を受け取ったときに発生するエラー"と言えます。 下のそれぞれの例から理解できればと思います。

<b>1-1）ValueError：参照する値がないとき</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490906/729b8db6-170a-4da1-6168-396ca7b4d6c8.png)
"a", "b", "c", "d"の値が存在するリストから、リストに存在しない値である"e"を
探そうとしたり、消そうとしたり、接近しようとする場合
該当参照値がないため、エラーが発生します。

［実行結果］
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490906/15e52615-5fda-301b-cc67-307dbb293fe7.png)


<b>1-2）ValueError：引数に不適切な値を受け取ったとき</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490906/01fd3233-88a3-5d44-c25f-8b26f6ff456c.png)
値をintタイプに変更してくれる、int( )関数に引数として“99.99”と“twelve”という値をいれてみると、ValueErrorが発生しました。

正しくは、int("1")のように整数に変更できる文字列が来るべきですが、
int("99,99")という小数点のある数字(float型)
int("twelve")という数字として認識されない・変更できない文字列が来ているため
実行結果にValueErrorエラーが発生します。

<h1>２．Python SyntaxError</h1>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490906/0d65bd2d-548a-2e90-856e-1cb5920cda2e.png)
作成したコードの<b>文法に間違いがあった場合、Syntax Error</b>が発生します。
ほとんどのSyntaxErrorは私たちが使用するIDEがチェックしてくれるので、赤い下線が引かれた部分を確認して解決できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490906/6911367d-a1d5-bba6-4857-543eba331ee3.png)
↑　for文の後に：コロンが抜けているためSyntax Errorが発生
<h1>３．Python TypeError</h1>
<b>間違ったタイプを渡した時に発生するエラーがType Error</b>です。

演算や関数に渡されるデータのタイプが間違っている場合に発生するエラーです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490906/c2c7d120-dd2e-27bf-9a82-0edf254fda74.png)
"Flynn" + 42 は文字列型と整数型タイプなのに、足し算ができない2つのデータタイプを足そうとすると、TypeErrorが発生することになります。

演算 1 + 42 と "Flynn" + "Shin" は、
それぞれ 43 と "FlynnShin" のように処理できます。

<h1>４．Python IndexError</h1>
<b>範囲外のindexにアクセスしようとした場合に発生</b>するエラーです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490906/5f18b364-1bac-8dc2-9f26-6be03face483.png)
［実行結果］
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490906/42af5321-8e68-2214-c8c3-e71b2f6e0772.png)

<h1>５．Python NameError</h1>
<b>ローカル変数、グローバル変数の名前が見つからない場合</b>にNameErrorが発生します。<br>
つまり、Pythonは上から下に順次コードを読んでいきますが、上の方で宣言してもいない変数を使用しようとした時に発生するエラーです。<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490906/f433d152-15a0-55ca-d9ed-67000100e01b.png)
［実行結果］
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490906/19359f94-ded7-41a6-f200-3ea5f6360e1d.png)
変数 apple と banana は宣言しましたが、変数 melon は作らなかったため、
変数 melon を使用しようとするとNameErrorが発生します。

<h1>６．Python FileNotFoundError</h1>
<b>ファイルやディレクトリにアクセスしようとする時、そのファイルやディレクトリがない場合に発生</b>するエラーがFileNotFoundErrorです。<br>
<br>
通常、ファイルやディレクトリにアクセスしようとする時、open関数を使用しますが、この時そのファイルが存在しないと、エラーが発生します。<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490906/0cdd7c94-a015-0b0a-69a7-ba5dc4ecfd4b.png)
［実行結果］
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490906/be6b122a-56e0-81dc-a4f1-5d19925c9b12.png)
エラーメッセージをよく見ると、「FileやDirectoryが存在しない」ということがわかります。

<h1>７．Python ZeroDivisionError</h1>
ZeroDivisionErrorは文字通り<b>0で割ろうとする場合に発生</b>するエラーです。<br>
1/0、3/0、10/0のように分母には 0 が入らないため発生するエラーです。<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490906/66d8e9dc-9bca-0e93-61e0-da65bd5b1692.png)
このように分母に 0 が入る場合、
つまり、0 で割るコードを作成した場合にエラーが発生します。

<h1>８．Python AttributeError</h1>

<b>Attribute参照や呼び出しが失敗した場合に発生</b>するエラーです。<br>
>※Attributeとは、Pythonでモジュールを使用する時<br>
import ファイル名
ファイル名 . <b>メソッド</b><br>
のように使用しますが、ここでメソッドに該当する部分をアトリビュートといいます。

まとめると、“モジュールのオブジェクトに該当するメソッドなどを誤って呼び出したり、使用した場合に発生するエラー”と言えます。

<b>randomというモジュールをimportし、該当モジュールにあるメソッドを呼び出し</b>てみました。randomモジュールには２つの数字の範囲内の整数をランダムでリターンする、<b>randintメソッド</b>が存在します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490906/33a02e79-4da5-376a-5b10-b3b8240aa640.png)
a では正常的にrandom.randint( )を呼び出し、
b ではrandom.randint1( )という存在しないメソッドも呼び出してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490906/80aef506-7ed4-f38f-eede-cdbe6e774bd8.png)
a の方は、範囲内でランダムで選ばれた整数 5 が結果として出ましたが、
b の方は、やはり<b>randomモジュールにrandint1( )といるメソッドはないためAttributeErrorが発生</b>していることが確認できます。

<h1>9．Python その他エラーを確認できる場所</h1>
ほとんどのPythonエラーはExceptionクラスによって導出されます。<br> 
Exceptionクラスが一番上にあり、その下に私たちが学んだ他のエラーが属しているのです。<br>
<br>

その他のPythonのエラーは、[Pythonドキュメント](https://docs.python.org/ja/3/library/exceptions.html)で確認できます。

それでは、エラーが発生してもプログラムが中断されないようにするにはどうすればいいでしょうか？ このようなエラー処理方法は例外処理(try exception)を通じて可能です。 次回のポストでは例外処理について見ていきたいと思います。

Writer :
エンジニアファーストの会社 [株式会社CRE-CO](https://www.cre-co.jp/#top)
SHIN BOYOUNG