組み込み例外一覧

組み込み例外一覧

組み込み例外一覧

 Python の例外は、BaseException から継承されるサブクラスのインスタンスです。SystemExit, KeyboardInterrupt, GeneratorExit を除くすべての例外クラスは、Exception から継承されています。Python 公式ドキュメントでは、新しい例外クラスを設計する場合には、BaseException ではなく Exception から継承するように推奨しています。

 以下に Exception から継承されている主要な組み込み例外をまとめておきます。トレースバックについてはエラーの説明文のみを掲載し、他の部分は省略してあります。

NameError

 未定義の変数を参照すると NameError を発生します。

# NameErrorの実例[1]

print(x)
NameError: name 'x' is not defined

 インポートしていないモジュールを使おうとしたり、未定義の関数を呼び出そうとしたときにも NameError が送出されます。

# NameErrorの実例[2]

a = math.sqrt(5)
name 'math' is not defined

 

TypeError

 定義されていない形でオブジェクトを処理しようとすると TypeError が発生します。たとえば、文字列と数値を加えようとする場合です。

# TypeErrorの実例[1]

print("10" + 1)
can only concatenate str (not "int") to str

 説明にあるように、文字列 (str) は文字列 (str) との間でのみ + 演算子による結合が定義されています:

print("10" + "1")
101

 連続整数を生成する range()関数には整数 (int) しか渡せません。たとえば浮動小数点数 (float) を渡すと TypeError となります。

# TypeErrorの実例[2]

x = 0

for k in range(10.1):
    x += 1

print(x)
TypeError: 'float' object cannot be interpreted as an integer

 

IndexError

 リストやタプルなどのシーケンス型オブジェクトで、範囲を超えるインデックスで要素を参照しようとすると、IndexError が発生します。

# IndexErrorの実例

# リストを定義
my_list = ["NumPy", "SciPy", "pandas"]

# 4番目の要素を参照
x = my_list[3]
IndexError: list index out of range

 

KeyError

 辞書型オブジェクト (dict) で存在しないキーを参照しようとすると、KeyError を発生します。

# KeyErrorの実例

# 辞書を定義
my_dic = {"日曜日":"晴れ",
          "月曜日":"雨",
          "火曜日":"曇り"}

# 4番目の要素を参照
x = my_dic["水曜日"]

print(x)
KeyError: '水曜日'

 

ImportError

 モジュールを読み込もうとしたときに問題があると、ImportError を送出します。次のコードはモジュールに存在しない関数を呼び出そうとしてエラーとなる実例です。

# importErrorの実例

from numpy import myfunc
ImportError: cannot import name 'myfunc' from 'numpy'

 

ModuleNotFoundError

 ModuleNotFoundError は ImportError のサブクラスです。
 インポートしようとするモジュール自体が見つからないときに送出されます。

# ModuleNotFoundErrorの実例

import nunpy
ModuleNotFoundError: No module named 'nunpy'

 

StopIteration

 イテレータが生成するアイテムがこれ以上ないときに、StopIteration を発生します。

# StopIterationの実例

my_list = ["a", "b", "c"]

my_iter = iter(my_list)

for i in range(4):
    print(next(my_iter))
a
b
c
StopIteration:

 

OverflowError

 演算結果が許容範囲を超える大きさになると OverflowError となります。

# OverflowErrorの実例

import math

# e=2.718...の1000乗を計算
x = math.exp(1000)

print(x)
OverflowError: math range error

 ただし、演算結果が表現できない値になったときの処理方法は関数によって異なります。たとえば、NumPy の指数関数 np.exp() は OverflowError の代わりに無限大を表す浮動小数点数 inf を返します:

import numpy as np

# e=2.718...の1000乗を計算
x = np.exp(1000)

print(x)
inf

 

ValueError

 関数が不適切な引数を受け取ると ValueError を発生します。これは受け取ったオブジェクトの型が適切でないという単純な理由だけでは説明できないこともあります。たとえば、int() に文字列 "Python" を渡すと ValueError を発生します。

# ValueErrorの実例[1]

a = int("Python")

print(a)
ValueError: invalid literal for int() with base 10: 'Python'

 しかし、int() に文字列 "100" を渡してもエラーは送出されずに、int 型オブジェクト 100 を返します。

a = int("100")

print(a)
100

 ところが、文字列 "100.5" は ValueError となります。

# ValueErrorの実例[2]

a = int("100.5")

print(a)
ValueError: invalid literal for int() with base 10: '100.5'

 このように同じ型でも受け取った値によって結果が異なるのは、int() が浮動小数点数の端数を処理するだけでなく、文字列で書かれた整数を intオブジェクトに変換するという機能を併せ持つように設計された関数だからです。
 

AttributeError

 オブジェクトに存在しない属性 (変数やメソッド) を参照しようとすると AttributeError を発生します。たとえば、文字列には uper() というメソッドがないので、以下のコードは AttributeError となります。

# AttributeErrorの実例

x = "Python".uper()

print(x)
AttributeError: 'str' object has no attribute 'uper'

 上のコードは文字列を大文字に変換するメソッド upper() を書き間違えたという例です。