Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
主要な組み込み例外
Pythonには多くの組み込み例外クラスが用意されています。エラーの種類を把握しておくと、適切なexceptブロックを書けるようになります。exceptブロックでは具体的な例外クラスを指定し、素のexceptやexcept Exceptionで何でも捕まえるのは原則として避けましょう。
主要な組み込み例外
| 例外クラス | 発生する状況 |
|---|---|
| ValueError | 型は正しいが値が不正な場合(例: int('abc'))。 |
| TypeError | 型が不正な操作に使われた場合(例: '文字' + 1)。 |
| KeyError | 辞書に存在しないキーにアクセスした場合。 |
| IndexError | リストの範囲外のインデックスにアクセスした場合。 |
| AttributeError | オブジェクトに存在しない属性やメソッドにアクセスした場合。 |
| FileNotFoundError | 存在しないファイルを開こうとした場合。 |
| ZeroDivisionError | 0で割り算をしようとした場合。 |
| NameError | 未定義の変数を参照した場合。 |
| ImportError | モジュールのインポートに失敗した場合。 |
| StopIteration | イテレータの要素がなくなった場合(通常は自動処理)。 |
| RecursionError | 再帰の深さ上限を超えた場合。 |
| MemoryError | メモリが不足した場合。 |
| OverflowError | 数値演算の結果が大きすぎる場合(floatのみ。intは任意精度)。 |
| NotImplementedError | サブクラスで実装すべきメソッドが未実装の場合に意図的に送出。 |
サンプルコード
# ValueError: 値が不正
try:
n = int('abc')
except ValueError as e:
print(f"ValueError: {e}") # invalid literal for int() with base 10: 'abc'
# TypeError: 型が不正
try:
result = '年齢: ' + 25
except TypeError as e:
print(f"TypeError: {e}") # can only concatenate str (not "int") to str
# KeyError: 辞書に存在しないキー
user = {'name': '田中', 'age': 30}
try:
email = user['email']
except KeyError as e:
print(f"KeyError: {e}") # KeyError: 'email'
# IndexError: リストの範囲外
fruits = ['apple', 'banana', 'cherry']
try:
print(fruits[10])
except IndexError as e:
print(f"IndexError: {e}") # list index out of range
# AttributeError: 存在しない属性
try:
'hello'.upper_case() # upper_case()は存在しない
except AttributeError as e:
print(f"AttributeError: {e}")
# FileNotFoundError: ファイルが存在しない
try:
with open('存在しないファイル.txt') as f:
content = f.read()
except FileNotFoundError as e:
print(f"ファイルが見つかりません: {e.filename}")
# ZeroDivisionError: 0除算
try:
result = 100 / 0
except ZeroDivisionError:
print("0で割ることはできません")
# 例外の継承関係を確認
print(issubclass(FileNotFoundError, OSError)) # True
print(issubclass(ZeroDivisionError, ArithmeticError)) # True
print(issubclass(ValueError, Exception)) # True
# 例外オブジェクトの情報
try:
x = int('abc')
except ValueError as e:
print(type(e).__name__) # ValueError
print(str(e)) # エラーメッセージ
print(e.args) # エラー引数のタプル
概要
Pythonの例外クラスは階層構造になっています。最上位は『BaseException』で、その下に『Exception』(通常のプログラムエラー)、KeyboardInterrupt、SystemExit などがあります。一般的なエラー処理では『Exception』のサブクラスを扱います。
例外クラスの継承関係を把握することで、適切な粒度でエラーを捕捉できます。例えば『FileNotFoundError』はOSErrorのサブクラスなので、except OSErrorで捕まえることもできますが、より具体的なFileNotFoundErrorを指定する方が意図が明確です。
except節に何も書かずに例外を無視するパターン(pass)は、問題の発見を困難にするアンチパターンです。最低でもログ出力やprint文を入れて、エラーが発生したことを記録するようにしましょう。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。