Pythonでプログラミングをしていると、様々な「例外(エラー)」に遭遇します。エラーメッセージは一見難しそうに見えますが、実は「何が間違っているか」を具体的に教えてくれる重要なヒントです。
例外の種類ごとの発生原因を知っておくことで、デバッグの速度は劇的に向上します。
この記事では、Python開発で頻繁に目にする代表的な例外と、その原因について解説します。
代表的な例外一覧
1. AttributeError
オブジェクトが持っていない属性(変数)やメソッドを使おうとしたときに発生します。タイプミスや、変数の型を勘違いしている場合によく起こります。
# 数値型(int)には append メソッドは存在しない
number = 100
# エラー発生: 'int' object has no attribute 'append'
# number.append(5)
2. IndexError
リストやタプルなどのシーケンス型に対し、存在しないインデックス(範囲外の位置)を指定した場合に発生します。
# 要素が3つしかないリスト (インデックスは 0, 1, 2)
menu_items = ["Coffee", "Tea", "Water"]
# 存在しないインデックス 5 にアクセスしようとする
# エラー発生: list index out of range
# item = menu_items[5]
3. KeyError
辞書(dict)に対し、存在しないキーを指定してアクセスしようとした場合に発生します。
# ユーザー情報の辞書
user_data = {"id": 101, "name": "Tanaka"}
# 存在しないキー "email" を取得しようとする
# エラー発生: 'email'
# email = user_data["email"]
対処法としては、.get() メソッドを使うか、in 演算子で事前に存在確認を行うのが一般的です。
4. TypeError
演算や関数に対して、不適切な「型」のオブジェクトを渡した場合に発生します。例えば、数値と文字列を直接足し算しようとした場合などです。
price = 1000
tax_str = "0.1" # 文字列
# 数値と文字列は足せない
# エラー発生: unsupported operand type(s) for +: 'int' and 'str'
# total = price + tax_str
5. ValueError
型(クラス)自体は正しいものの、その「値」が不適切な場合に発生します。文字列を数値に変換する際、数字として解釈できない文字列を渡した場合などが典型的です。
# "123" は int に変換できるが、"hello" はできない
input_text = "hello"
# エラー発生: invalid literal for int() with base 10: 'hello'
# number = int(input_text)
6. ZeroDivisionError
数値を 0 で割ろうとした場合に発生します。数学的に定義できない計算です。
count = 0
total = 500
# 0除算
# エラー発生: division by zero
# average = total / count
例外の階層構造(継承関係)
Pythonのすべての例外はクラスとして定義されており、階層構造を持っています。
BaseException
すべての例外の基底(ルート)となるクラスです。通常のプログラムエラーだけでなく、システム終了 (SystemExit) やキーボード中断 (KeyboardInterrupt) なども含まれます。
Exception
通常のプログラムで発生する例外の基底クラスです。BaseException を継承していますが、システム終了などは含まれていません。
どちらを捕捉すべきか?
try-except 文で広範囲のエラーを捕捉したい場合、BaseException ではなく Exception を指定するべきです。
try:
# 何らかの処理
pass
except Exception as e:
# 通常のエラーのみをキャッチする(推奨)
print(f"エラー: {e}")
もし except BaseException: や単に except: と書いてしまうと、プログラムを強制終了させたい場合(Ctrl+C を押した場合など)のシグナルまで捕捉してしまい、プログラムが停止できなくなる恐れがあるためです。
まとめ
エラーが発生した際は、まず「例外の名前」を確認してください。
- AttributeError: 属性やメソッドがない
- IndexError: リストの範囲外
- KeyError: 辞書のキーがない
- TypeError: 型が合わない
- ValueError: 値の形式がおかしい
- ZeroDivisionError: 0で割っている
これらの意味を理解していれば、エラーメッセージを見た瞬間に修正箇所のアタリを付けることができます。
