カテゴリ: Python 更新日: 2026/02/18

Pythonのカスタム例外を完全ガイド!初心者でもわかる独自Exceptionクラスの作り方

Pythonのカスタム例外を作成する方法(独自のExceptionクラス)
Pythonのカスタム例外を作成する方法(独自のExceptionクラス)

先生と生徒の会話形式で理解しよう

生徒

「先生、Pythonでエラーが出たときに、自分で好きなメッセージを作ったり、決まった形の例外を作ったりできますか?」

先生

「もちろんできますよ。Pythonでは、カスタム例外と呼ばれる独自のエラークラスを作ることができるんです。」

生徒

「カスタム例外ってどんなときに役立つんですか?普通の例外だけじゃだめなんですか?」

先生

「普通の例外でも十分な場合はあります。でも、大きいプログラムになったり人と共同で作るときは、専用の例外があると原因がすぐに分かるので、とても便利なんです。」

生徒

「なるほど!まずは基本から知りたいです!」

1. Pythonのカスタム例外とは?(独自例外の基礎)

1. Pythonのカスタム例外とは?(独自例外の基礎)
1. Pythonのカスタム例外とは?(独自例外の基礎)

Pythonのカスタム例外(独自例外)とは、プログラミング言語が最初から用意しているエラーではなく、開発者が「自分たちのルール」に基づいて新しく作成するエラーのことです。

例えば、標準のPythonには「年齢がマイナスです」というエラーは存在しません。しかし、システム開発においては「1000円の商品にマイナスの金額が入力された」「20歳未満なのに成人向けサービスにアクセスした」といった、業務上のルール違反(ビジネスロジックの例外)をエラーとして扱いたい場面が多々あります。

プログラミング未経験の方でもイメージしやすいように、簡単な例を見てみましょう。会員登録で「18歳未満は登録できない」というルールを、独自の例外として定義するイメージです。


# 1. 「18歳未満禁止」という自分専用のエラー(例外クラス)を定義
class UnderAgeError(Exception):
    pass

# 2. ユーザーの年齢をチェックする関数
def register_member(age):
    if age < 18:
        # 自分で作ったエラーを発生(raise)させる
        raise UnderAgeError("18歳未満の方は登録できません。")
    else:
        print("会員登録が完了しました!")

# 3. 実行してみる
try:
    register_member(15)
except UnderAgeError as e:
    print(f"【エラー通知】: {e}")

このようにカスタム例外を使うと、「何が原因でプログラムが止まったのか」がひと目で分かるようになります。標準のValueErrorなどを使うよりも、「UnderAgeError(年齢不足エラー)」という名前が付いている方が、後からコードを読み返した時やチームで開発する時に、圧倒的に理解しやすくなるのが最大のメリットです。

2. カスタム例外を作る基本(独自のExceptionクラス)

2. カスタム例外を作る基本(独自のExceptionクラス)
2. カスタム例外を作る基本(独自のExceptionクラス)

Pythonでカスタム例外を作る方法はとてもシンプルです。標準で用意されているExceptionクラスを継承して、自分専用のクラスを作るだけです。名前はエラー内容が想像しやすいようにするのがポイントです。


class InvalidAgeError(Exception):
    pass

このように書くと、InvalidAgeErrorという新しい例外が誕生します。これを実際のプログラムで使うと、年齢入力が間違っていることを明確に伝えることができます。

3. カスタム例外を実際に使ってみよう

3. カスタム例外を実際に使ってみよう
3. カスタム例外を実際に使ってみよう

たとえば、年齢を入力してもらう小さなプログラムを作るとします。数字ではない文字が入ったときや、ありえない数字が入ったときにカスタム例外で知らせてあげるととても分かりやすい動作になります。


class InvalidAgeError(Exception):
    def __init__(self, age):
        self.age = age
        super().__init__(f"{age} は正しい年齢ではありません。")

def check_age(age):
    if age < 0 or age > 150:
        raise InvalidAgeError(age)
    return "年齢は正しく入力されています。"

try:
    result = check_age(-5)
    print(result)
except InvalidAgeError as e:
    print("カスタム例外が発生しました:", e)

カスタム例外が発生しました: -5 は正しい年齢ではありません。

4. try / except / else / finally の流れも理解しよう

4. try / except / else / finally の流れも理解しよう
4. try / except / else / finally の流れも理解しよう

例外処理の流れを理解すると、カスタム例外をどこでどのように扱うべきかが自然と分かるようになります。tryは危険な処理を入れる場所、exceptは例外が起きたときの対処、elseは成功したときの処理、finallyは必ず実行する処理をまとめます。


try:
    print("データを読み込みます")
except Exception:
    print("エラーが発生しました")
else:
    print("問題ありませんでした")
finally:
    print("処理を終了します")

5. カスタム例外を使うメリット

5. カスタム例外を使うメリット
5. カスタム例外を使うメリット

カスタム例外の大きなメリットは、原因がすぐに分かるという点です。例えば、入力エラー、ネットワークエラー、権限エラーなど、種類ごとにクラスを作っておけば、except文で的確に処理できます。また、ログを記録する際にも、どの種類のエラーが起きたかを分けて保存できるため、後から調査がしやすくなります。

6. 実務でよく使われるカスタム例外の例

6. 実務でよく使われるカスタム例外の例
6. 実務でよく使われるカスタム例外の例

実務では、入力のチェック、APIの通信失敗、ファイルの読み取りミスなど、専用の例外があるととても便利です。チーム開発では、例外の名前とルールを統一すると、プログラムの品質が安定し、保守性も大きく向上します。データベース処理でも「データが見つからないエラー」などをカスタム例外化することがよくあります。

7. カスタム例外を階層化して整理する方法

7. カスタム例外を階層化して整理する方法
7. カスタム例外を階層化して整理する方法

大きなプロジェクトでは、例外を階層化して整理することも重要です。共通の親クラスを作り、その下に細かいエラーを並べることで、ある種類のエラーだけをまとめて捕捉することができます。この仕組みは、後からエラーを増やしたいときにも柔軟に対応できます。


class AppError(Exception):
    pass

class DataNotFoundError(AppError):
    pass

class PermissionDeniedError(AppError):
    pass

このように階層化しておけば、AppErrorをexceptで受け取るだけで共通の処理が可能になります。

コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

関連記事:
カテゴリの一覧へ
新着記事
New1
Python
Pythonでデータベースの接続プールを使う方法を徹底解説!初心者向けPythonデータベース接続プール入門
New2
Python
Pythonの例外チェーンを完全ガイド!初心者でもわかるfrom句を使ったエラーハンドリング
New3
PHP
PHPのCSVファイルの読み書きと文字列処理を基礎から解説!初心者向けガイド
New4
PHP
PHPのメモリ管理と変数の破棄方法をやさしく解説!初心者でもわかるunsetの使い方
人気記事
No.1
Java&Spring記事人気No1
Python
PythonでExcelファイル(.xlsx)を操作する方法を徹底解説!初心者でもできるopenpyxl・pandasの使い方
No.2
Java&Spring記事人気No2
PHP
PHP のフォームデータの受け取り($_POST, $_GET)を完全解説!初心者向けガイド
No.3
Java&Spring記事人気No3
Python
Pythonのコンストラクタ(__init__)の使い方!初心者でもわかるオブジェクトの初期化
No.4
Java&Spring記事人気No4
PHP
PHPのデバッグ方法を完全ガイド!初心者でもわかるvar_dump・print_r・error_log
No.5
Java&Spring記事人気No5
PHP
PHPの特殊文字とエスケープ処理を完全ガイド!初心者向けにhtmlspecialcharsとhtmlentitiesをやさしく解説
No.6
Java&Spring記事人気No6
Python
Pythonで文字列が数値か判定する方法!isdigit()・isnumeric()の違い
No.7
Java&Spring記事人気No7
PHP
PHPのfor, while, do-whileループの使い方を完全ガイド!初心者でもわかる繰り返し処理
No.8
Java&Spring記事人気No8
Python
Pythonの書き方を基本から解説!はじめてのPythonプログラム