プログラミングしていると、必ずエラーが発生します。初心者の場合、エラーが解決できないと、挫折することもあります。
そこで本記事では、初心者にとってわかりやすいように、代表的な例外クラスの種類と、その原因を紹介します。さらに、例外処理の基礎やユーザー定義例外クラスの作成方法についても解説します。
Python初心者にとっては必見の内容となっていますので、最後までお願いします。
Pythonを勉強する時、何から勉強するか分からず、挫折します。初心者でも、中級者でも、レベルに合わせた勉強方法を分かりやすくまとめています。
NameError:未定義の変数名を使用した
NameErrorは、「変数や関数を参照して、その名前が未定義」である場合に発生する例外です。
具体的には、以下のような場合にNameErrorが発生します。
- 未定義の変数を参照した場合
- 未定義の関数を呼び出した場合
- 未定義のクラスを参照した場合
などが挙げられます。
NameErrorの例
具体的な例として、以下のようなコードを実行した場合にNameErrorが発生します。
a = 100
b = a + c
print(b)
このコードでは、変数cが未定義のため、a + cが評価できず、以下のエラーが発生します。
NameError: name 'c' is not defined
NameErrorの対処法
NameErrorを回避するためには、参照する名前が定義されていることを確認しましょう。
具体的には、以下のような方法が考えられます。
- 変数や関数を定義する
- 外部モジュールやライブラリを正しくインポートする
当たり前ですね
例えば、変数cを定義することでNameErrorを回避することができます。
a = 100
c = 200
b = a + c
print(b)
あと、VSCodeのようなエディターを使えば、NameErrorの回避がしやすくなります。
TypeError:型の不一致
TypeErrorは、関数や演算子などで、データ型が異なるオブジェクト同士を組み合わせて処理した場合に発生します。
具体的には、以下のような場合に発生します。
- 整数型と文字列型を組み合わせた演算を行った場合
- 関数に期待される引数の型と異なる型の引数を渡した場合
- リストに異なる型の要素を混在させた場合
などが挙げられます。
TypeErrorの例
具体的な例として、以下のようなコードを実行した場合にTypeErrorが発生します。
a = 100
b = "200"
c = a + b
print(c)
このコードでは、整数型の変数aと文字列型の変数bを足し算して、変数cに代入しようとしています。
しかし、整数型と文字列型は異なる型のオブジェクトであり、足し算できません。そのため、次のようなTypeErrorが発生します。
TypeError: unsupported operand type(s) for +: 'int' and 'str'
このエラーメッセージは、足し算を行うための演算子+が、整数型と文字列型のオペランドに対してサポートされていないことを示しています。
TypeErrorの対処法
TypeErrorを回避するためには、処理を行う前にオブジェクトの型を確認する必要があります。
具体的には、以下のような方法が考えられます。
- isinstance()関数を使って、オブジェクトの型を確認する
- 型変換を行って、オブジェクトの型を揃える
例えば、文字列型の変数bを整数型に変換してから足し算を行うことで、TypeErrorを回避することができます。
a = 100
b = "200"
c = a + int(b)
print(c)
このコードでは、文字列型の変数bをint()
を使って整数型に変換してから、足し算を行っています。これにより、TypeErrorを回避することができます。
ValueError:値が不正
ValueErrorは、Pythonにおいて、関数やメソッドなどに渡された引数の値が不正である場合に発生する例外です。
具体的には、以下のような場合にValueErrorが発生します。
- 関数やメソッドの引数の型が正しくない場合
- 文字列を数値として解釈できない場合
- シーケンス(リストやタプルなど)の要素が期待される型でない場合
などが挙げられます。
ValueErrorの例
具体的な例として、以下のようなコードを実行した場合にValueErrorが発生します。
num = int("abc")
このコードでは、文字列”abc”をint()
で数値に変換しようとしていますが、”abc”は数値として解釈できないため、以下のエラーが発生します。
ValueError: invalid literal for int() with base 10: 'abc'
このエラーメッセージは、”abc”という文字列は10進数の数値として不正であるため、int()
で変換することができないことを示しています。
ValueErrorの対処法
ValueErrorを回避するためには、関数やメソッドの引数の型を正しくするか、入力された値が適切であるかを事前にチェックする必要があります。
例えば、文字列を数値に変換する前に、文字列が数値に変換可能かどうかをチェックできます。
input_str = "abc"
if not input_str.isnumeric():
print("入力された値は数値ではありません。")
else:
num = int(input_str)
print(num)
このコードでは、isnumeric()
メソッドを使って、入力された文字列が数値に変換可能かどうかをチェックしています。
isnumeric()
メソッドは、文字列がすべて数字で構成されている場合にTrueを返します。
IndexError:範囲外のインデックスを参照した
IndexErrorは、Pythonにおいて、リストやタプルなどのシーケンス型の要素にアクセスする際、インデックスが範囲外の場合に発生する例外です。
具体的には、以下のような場合にIndexErrorが発生します。
- シーケンスの範囲を超えるインデックスを指定した場合
- 空のシーケンスにアクセスしようとした場合
などが挙げられます。
IndexErrorの例
具体的な例として、以下のようなコードを実行した場合にIndexErrorが発生します。
lst = [1, 2, 3]
print(lst[3])
このコードでは、リストlstの範囲を超えるインデックス3を指定しています。そのため、次のようなIndexErrorが発生します。
IndexError: list index out of range
このエラーメッセージは、リストlstには4つの要素がなく、範囲外のインデックス3にアクセスしたため、IndexErrorが発生したことを示しています。
IndexErrorの対処法
IndexErrorを回避するためには、シーケンスの範囲内のインデックスを指定する必要があります。
例えば、リストの要素数を取得して、範囲内のインデックスを指定することができます。
lst = [1, 2, 3]
if len(lst) <= 3:
print(lst[3])
else:
print("インデックスが範囲外です。")
このコードでは、リストlstの要素数をlen()
で取得し、指定したインデックスが範囲内かどうかをチェックしています。要素数が3以下の場合には、指定したインデックスが範囲外になるため、エラーメッセージを表示するようにしています。
KeyError:辞書のキーが存在しない
KeyErrorは、Pythonにおいて、辞書型のキーに存在しない値を指定した場合に発生する例外です。
具体的には、以下のような場合にKeyErrorが発生します。
- 存在しないキーを指定した場合
- キーを指定しなかった場合
などが挙げられます。
KeyErrorの例
具体的な例として、以下のようなコードを実行した場合にKeyErrorが発生します。
dic = {'key1': 1, 'key2': 2, 'key3': 3}
print(dic['key4'])
このコードでは、存在しないキーkey4を指定しています。そのため、次のようなKeyErrorが発生します。
KeyError: 'key4'
このエラーメッセージは、辞書dicにはキーkey4が存在しないため、KeyErrorが発生したことを示しています。
KeyErrorの対処法
KeyErrorを回避するためには、存在するキーを指定する必要があります。
例えば、キーが存在するかどうかをチェックしてから、アクセスすることができます。
dic = {'key1': 1, 'key2': 2, 'key3': 3}
if 'key4' in dic:
print(dic['key4'])
else:
print("指定したキーが存在しません。")
このコードでは、キーが存在するかどうかをin演算子でチェックし、存在しない場合にはエラーメッセージを表示しています。
また、get()
メソッドを使っても同様のことができます。
dic = {'key1': 1, 'key2': 2, 'key3': 3}
print(dic.get('key4', "指定したキーが存在しません。"))
このコードでは、get()
メソッドで指定したキーが存在しない場合には、第2引数で指定したエラーメッセージを表示するようにしています。
ZeroDivisionError:0で除算しようとした
ZeroDivisionErrorは、0で割ろうとした場合に発生する例外です。
Pythonでは、整数型や浮動小数点型の数値を扱う際に、0で割ろうとするとZeroDivisionErrorが発生します。
ZeroDivisionErrorは、コードにバグがあることを示す可能性があるため、しっかりと対処する必要があります。
ZeroDivisionErrorの例
具体的な例として、以下のようなコードを実行した場合にZeroDivisionErrorが発生します。
a = 1
b = 0
c = a / b
print(c)
このコードでは、0で割ろうとしているため、ZeroDivisionErrorが発生します。
ZeroDivisionError: division by zero
このエラーメッセージは、ゼロで割ることができないため、ZeroDivisionErrorが発生したことを示しています。
ZeroDivisionErrorの対処法
ZeroDivisionErrorを回避するためには、計算前に割られる数が0以外かチェックする必要があります。
例えば、以下のようにif文でチェックすることができます。
a = 1
b = 0
if b == 0:
print("0で割ることはできません。")
else:
c = a / b
print(c)
このコードでは、割られる数が0かをif文でチェックし、0の場合はエラーメッセージを表示しています。
また、try-except文を使って例外処理をすることもできます。
以下のように、tryブロック内で割り算を行い、ZeroDivisionErrorが発生した場合には、exceptブロック内でエラーメッセージを表示するようにしています。
a = 1
b = 0
try:
c = a / b
print(c)
except ZeroDivisionError:
print("0で割ることはできません。")
FileNotFoundError:存在しないファイルを開こうとした
FileNotFoundErrorは、存在しないファイルを読み込んだり、存在しないディレクトリにアクセスしようとした場合に発生する例外です。
このエラーは、ファイルやディレクトリが存在しないため、処理が続行できない場合に発生します。
例えば、ファイルを開く際に、ファイルが存在しない場合にはFileNotFoundErrorが発生します。
FileNotFoundErrorの例
具体的な例として、以下のようなコードを実行した場合にFileNotFoundErrorが発生します。
with open("file.txt", "r") as f:
content = f.read()
print(content)
このコードでは、存在しないファイル”file.txt”を読み込もうとしているため、FileNotFoundErrorが発生します。
FileNotFoundError: [Errno 2] No such file or directory: 'file.txt'
このエラーメッセージは、”file.txt”というファイルが存在しないため、FileNotFoundErrorが発生したことを示しています。
FileNotFoundErrorの対処法
FileNotFoundErrorを回避するためには、ファイルやディレクトリが存在するかどうかを事前にチェックする必要があります。
例えば、以下のようにosモジュールを使って、ファイルが存在するかチェックできます。
import os
filename = "file.txt"
if not os.path.exists(filename):
print(f"{filename}は存在しません。")
else:
with open(filename, "r") as f:
content = f.read()
print(content)
このコードでは、os.path.exists()
を使って、”file.txt”というファイルが存在するかどうかをチェックしています。
ファイルが存在しない場合には、エラーメッセージを表示し、存在する場合には、ファイルを読み込んでコンテンツを表示するようにしています。
また、try-except文を使って例外処理をすることもできます。
以下のように、tryブロック内でファイルを開き、FileNotFoundErrorが発生した場合には、exceptブロック内でエラーメッセージを表示するようにしています。
filename = "file.txt"
try:
with open(filename, "r") as f:
content = f.read()
print(content)
except FileNotFoundError:
print(f"{filename}は存在しません。")
IOError:入出力エラーが発生した
PythonのIOErrorは、ファイルの入出力操作に失敗した場合に発生する例外です。
ファイルが存在しない、アクセス権限がない、書き込み不可の場所に書き込もうとした、など様々な場合に発生することがあります。
IOErrorの例外メッセージ
IOErrorが発生した場合、次のような例外メッセージが表示されます。
IOError: [Errno 2] No such file or directory: 'filename.txt'
この例外メッセージは、ファイルが存在しない場合に発生することが多いです。”filename.txt”は存在しないファイル名です。この場合、ファイルが存在しないことを示す”No such file or directory”というメッセージが表示されます。
IOErrorの原因と対処法
IOErrorの原因としては、次のようなことが挙げられます。
- ファイルが存在しない
- ファイルにアクセスする権限がない
- ディスク容量が不足している
- ファイルが他のプログラムによってロックされている
- ファイルが破損している
対処法は以下の通りです。
- ファイルが存在しない場合は、ファイルを作成するか、存在する場所を確認する。
- ファイルにアクセスする権限がない場合は、ファイルのアクセス権限を変更する。
- ディスク容量が不足している場合は、不要なファイルを削除する。
- ファイルが他のプログラムによってロックされている場合は、ロックが解除されるまで待つ。
- ファイルが破損している場合は、別のバックアップファイルを使用するか、修復する。
IOErrorの例
以下は、IOErrorが発生する例です。
filename = "test.txt"
try:
with open(filename, 'r') as file:
print(file.read())
except IOError:
print(f"ファイル '{filename}' が見つかりませんでした。")
この例では、open()
関数を使用してファイルを開き、そのファイルの内容を読み込んでいます。しかし、もし指定されたファイルが存在しない場合、open()
関数はIOErrorを発生させます。
そのため、try-except文を使用して、open()
関数がIOErrorを発生させた場合には、”ファイル ‘test.txt’ が見つかりませんでした。”というメッセージを表示しています。
ModuleNotFoundError:インポートしようとしたモジュールが存在しない
Pythonでは、標準ライブラリや外部ライブラリを使用することができます。しかし、プログラム中で使用するモジュールが存在しない場合、ModuleNotFoundErrorが発生します。
ModuleNotFoundErrorの例
例えば、以下のようなコードを実行した場合、ModuleNotFoundErrorが発生します。
import my_module
この場合、Pythonは”my_module”というモジュールを検索しますが、そのモジュールが見つからなかった場合、ModuleNotFoundErrorが発生します。
ModuleNotFoundErrorの対処法
ModuleNotFoundErrorを回避するには、必要なモジュールがインストールされているか確認し、必要に応じてインストールする必要があります。また、モジュールを正しく指定しているか確認することも重要です。
例えば、my_packageというパッケージに含まれるmy_moduleというモジュールをインポートする場合は、以下のように書きます。
from my_package import my_module
もし、必要なモジュールが見つからない場合には、モジュールをインストールする必要があります。Pythonでは、pipを使用してモジュールをインストールすることができます。
pip install module_name
このコマンドを実行することで、指定したモジュールをインストールすることができます。
Python学習におすすめのコンテンツ
現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル
Udemyの講座でPythonなら、文句なしにおすすめ
- 分かりやすい言葉や具体的なコードで工夫して説明しているので、初心者でも理解できる。
- 初心者でも挫折しないように、丁寧に詳しく手順を説明している。
- 講座内で取り扱う課題は実践的なものが多く、書籍では身につかない応用力を身につけられる。
- 情報量が多いのに、講座の進み方が速いので、一回では理解が追いつかない。
- 課題の難易度が高すぎる場合がある。
- 講師のアクセントが特殊で、聞き取りにくいと感じたことがある。
テスト駆動Python 第2版
日本語で唯一、pytestだけに焦点を当てて、詳細に書かれた書籍です。
- 日本語でpytestの全てについて、解説されている唯一の書籍
- 段々とステップアップして、深くなるので、初心者でも、中級者でも、上級者でも、学びがある
- サンプルコードには、サンプルアプリが含まれているため、実践的に学べる工夫あり
- 章末にまとめがあり、復習の役に立つ
- 第7章に「どのようなテストを書くのか」についての解説があり、テストに対する考え方が深まる
- 後半になると、かなり高度な内容になるため、初心者には難しい
- タイトルに「テスト駆動開発」と書かれているが、該当部分の記述が少なく、テスト駆動開発を知りたい人は期待外れになるかも
間違えて、第1版を買わないように注意して下さい。
まとめ
この記事では、Pythonの代表的な例外クラスの発生条件と対処法について、解説しました。
プログラミング初心者から上級者まで、Python開発をすると必ずエラーに遭遇します。エラーが発生することは避けられないため、例外処理の理解は重要ですので、迷った際はこの記事を見返して頂けると幸いです。
ここまでお読みいただき、ありがとうございました。
\ 更新の励みになるので、ポチッとしてね /
他にもスキルアップやキャリアアップの役に立つ情報が満載です。他の記事も読んで、ゆっくりしていってね!
Pythonを勉強する時、何から勉強するか分からず、挫折します。初心者でも、中級者でも、レベルに合わせた勉強方法を分かりやすくまとめています。
コメント