Pythonの例外基本クラス徹底解説|BaseExceptionと例外階層、独自例外の作り方
Pythonにおける例外とは
Pythonには、他の高水準言語と同様に例外(Exception)の仕組みが備わっています。プログラムの実行中に問題が検出されると例外が発生(raise)し、適切に処理しなければプログラムはその時点で中断されます。代表的な例外には、ゼロ除算を表すZeroDivisionErrorや、アサーションの失敗を表すAssertionErrorなど、さまざまな種類があります。
すべての例外クラスはBaseExceptionクラスから派生しています。開発者は組み込みの例外をそのまま利用できるだけでなく、raise文を使ってコード中で意図的に例外を発生させることもできます。さらに、Exceptionクラス、あるいはその子クラスを継承すれば、用途に応じた独自の例外クラスを定義することも可能です。
BaseExceptionはすべての例外の基底クラスですが、ユーザー定義クラスをこのクラスから直接派生させることは避けるべきとされています。独自の例外クラスを作成する場合は、必ずExceptionクラス(またはその子クラス)を継承するのがPythonの作法です。
Pythonの例外クラス階層
Pythonの主要な例外クラスは、次のような階層構造で整理されています。
- BaseException
- Exception
- ArithmeticError
- FloatingPointError
- OverflowError
- ZeroDivisionError
- AssertionError
- AttributeError
- BufferError
- EOFError
- ImportError
- ModuleNotFoundError
- LookupError
- IndexError
- KeyError
- MemoryError
- NameError
- UnboundLocalError
- OSError
- BlockingIOError
- ChildProcessError
- ConnectionError
- BrokenPipeError
- ConnectionAbortedError
- ConnectionRefusedError
- ConnectionResetError
- FileExistsError
- FileNotFoundError
- InterruptedError
- IsADirectoryError
- NotADirectoryError
- PermissionError
- ProcessLookupError
- TimeoutError
- ReferenceError
- RuntimeError
- NotImplementedError
- RecursionError
- StopIteration
- StopAsyncIteration
- SyntaxError
- IndentationError
- TabError
- IndentationError
- SystemError
- TypeError
- ValueError
- UnicodeError
- UnicodeDecodeError
- UnicodeEncodeError
- UnicodeTranslateError
- UnicodeError
- Warning
- BytesWarning
- DeprecationWarning
- FutureWarning
- ImportWarning
- PendingDeprecationWarning
- ResourceWarning
- RuntimeWarning
- SyntaxWarning
- UnicodeWarning
- UserWarning
- ArithmeticError
- GeneratorExit
- KeyboardInterrupt
- SystemExit
- Exception
独自例外クラスの作成例
課題:従業員情報を管理するクラスを作成します。ただし、「従業員の年齢は18歳より大きくなければならない」という業務ルールがあるものとします。
そこで、18歳未満のデータが渡されたときに発生させる、Exceptionクラスの子クラスとして独自の例外クラスを定義してみましょう。
サンプルコード
class LowAgeError(Exception):
def __init__(self):
pass
def __str__(self):
return '年齢は18歳より大きくなければなりません'
class Employee:
def __init__(self, name, age):
self.name = name
if age < 18:
raise LowAgeError # 条件を満たさない場合に独自例外を発生
else:
self.age = age
def display(self):
print('従業員名: ' + self.name + '、年齢: ' + str(self.age) + '歳')
try:
e1 = Employee('Subhas', 25)
e1.display()
e2 = Employee('Anupam', 12) # ここでLowAgeErrorが発生
e2.display()
except LowAgeError as e:
print('エラー発生: ' + str(e))
実行結果
従業員名: Subhas、年齢: 25歳 エラー発生: 年齢は18歳より大きくなければなりません
コードのポイント
- LowAgeErrorはExceptionクラスを継承した独自例外クラスです。
__str__メソッドをオーバーライドすることで、例外発生時に表示されるメッセージをカスタマイズしています。 - Employeeクラスのコンストラクタ内では、引数
ageが18未満の場合にraise文でLowAgeErrorを発生させます。 try〜exceptブロックで例外を捕捉しているため、例外が発生してもプログラムが異常終了せず、エラーメッセージを出力して処理を続行できます。- 2人目の従業員Anupam(12歳)のインスタンス生成時に例外が発生するため、直後の
display()は実行されず、exceptブロックのメッセージのみが出力されます。
このように、独自例外クラスを定義することで、アプリケーション固有のエラー状況を明確に表現でき、可読性と保守性に優れたエラーハンドリングを実現できます。
-
PythonでNotImplementedError例外をキャッチする方法をわかりやすく解説
Pythonでは、ユーザー定義の基底クラス(親クラス)内で NotImplementedError を発生させることで、「このメソッドはサブクラス側で必ずオーバーライドして実装してください」という意図を明確に表現できます。これは、Javaなどの言語におけるインターフェースのような役割をシミュレートするための一般的な手法です。 NotImplementedError は組み込み例外 RuntimeError の派生クラスです。そのため、抽象メソッドとして振る舞わせたいメソッドの中で、派生クラスによる実装を強制したい場合にこの例外を raise するのが定番の使い方となっています。 NotImp
-
PythonでEnvironmentError例外を捕捉する方法をわかりやすく解説
EnvironmentErrorとは何か EnvironmentErrorは、Pythonの外部から発生するエラー(オペレーティングシステムやファイルシステムなどに起因するもの)のための基底クラスです。StandardErrorクラスのサブクラスであり、同時にIOErrorおよびOSErrorという例外の基底クラスでもあります。 重要なポイントとして、EnvironmentError自体は直接発生(raise)されることはありません。実際にプログラム上で捕捉するのは、そのサブクラスであるIOErrorやOSErrorになります。 EnvironmentErrorの継承関係 Environme