Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでユーザー定義例外を作成する方法を具体例とともに解説

Pythonでは、コードが異常な動作をするとエラーや例外(Exception)が発生し、プログラムの実行が途中で中断されます。こうした状況に対応するために、Pythonはtry-except文による例外処理の仕組みを提供しています。標準で用意されている主な例外には、ArithmeticError、AssertionError、AttributeError、ImportErrorなどがあります。

しかし、標準の例外だけでは表現しきれないアプリケーション固有のエラー状態もあります。そこで役立つのが「ユーザー定義例外」です。この記事では、独自の例外クラスを作成して使う方法を、具体的なコード例とともにわかりやすく解説します。

ユーザー定義例外クラスの作成方法

ユーザー定義の例外クラスは、組み込みのExceptionクラスを直接または間接的に継承して作成します。以下の例では、「User_Error」という新しい例外クラスを定義し、コンストラクタ(__init__)と表示用メソッド(__str__)を持たせています。

コード例

# Exceptionクラスを継承したUser_Errorクラスを定義
class User_Error(Exception):
    # コンストラクタ
    def __init__(self, value):
        self.value = value
    # __str__ による表示用メソッド
    def __str__(self):
        return(repr(self.value))

try:
    raise(User_Error("User defined error"))
    # 例外オブジェクトはerrorに格納される
except User_Error as error:
    print('A New Exception occured:', error.value)

実行結果

A New Exception occured: User defined error

raise文で独自の例外を発生させ、except句でその例外を受け取って処理している点に注目してください。これにより、エラー発生時の挙動を自由に制御できます。

複数の例外を扱う設計(基底クラスを使った多重継承)

1つのモジュールで複数種類のエラーを扱いたい場合には、モジュール専用の基底例外クラスを作成し、それを各エラー用の派生クラスが継承する構成が有効です。これにより、エラーの種類ごとに個別の例外クラスを整理して管理できます。

コード例

# Pythonのユーザー定義例外を定義
class Error(Exception):
    """他の例外のための基底クラス"""
    pass

class Dividebyzero(Error):
    """入力値がゼロの場合に発生する例外"""
    pass

try:
    i_num = int(input("Enter a number: "))
    if i_num == 0:
        raise Dividebyzero
except Dividebyzero:
    print("Input value is zero, try again!")
    print()

実行結果

Enter a number: Input value is zero, try again!

この構成のメリットは、基底クラス「Error」をまとめてexceptすることもできるため、細かい分岐と大まかな分類の両方に柔軟に対応できる点です。

組み込み例外(RuntimeError)を基底クラスとして利用する

発生したエラーが既存のどのカテゴリにも当てはまらない場合に使われるのが、組み込みのRuntimeErrorクラスです。次のプログラムは、RuntimeErrorを基底クラスとして、ユーザー定義の例外クラスを派生させる方法を示しています。

コード例

# ユーザー定義のエラー
class Usererror(RuntimeError):
    def __init__(self, arg):
        self.args = arg

try:
    raise Usererror("userError")
except Usererror as e:
    print(e.args)

実行結果

('u', 's', 'e', 'r', 'E', 'r', 'r', 'o', 'r')

文字列をそのままargsに渡すと、文字列がイテラブルとして扱われ、1文字ずつタプルに展開される点に注意しましょう。実務では self.args = (arg,) のようにタプルで渡すのが一般的です。

まとめ

この記事では、Pythonにおけるユーザー定義例外の宣言方法と実装方法を学びました。ポイントを整理すると以下の通りです。

  • ユーザー定義例外は必ずExceptionクラス(またはそのサブクラス)を継承して作成する
  • モジュール単位で基底例外クラスを作ると、複数のエラーを体系的に管理できる
  • 用途に応じてRuntimeErrorなどの組み込み例外を基底クラスに選ぶことも可能

独自の例外を適切に設計することで、エラーの意味が明確になり、デバッグや保守性の向上にもつながります。ぜひ実際のプロジェクトでも活用してみてください。

  1. Pryで例外をスマートに扱う方法|バックトレース表示からカスタマイズまで

    Rails開発者なら、Railsコンソールを頻繁に使う方も多いのではないでしょうか。そして今や、RailsコンソールといえばPryが定番。素のIRBと比べると、その使い勝手は段違いです。 実はPryには、例外を扱う際に非常に便利な機能が標準で組み込まれています。この記事では、その中でも特に役立つ3つの機能を紹介します。 直近の例外の完全なバックトレースを表示する Pry(IRBでも同様)で例外が発生すると、通常は短縮されたバックトレースが表示されます。多くの場合それで十分ですが、詳細を確認したい場面もありますよね。 そんなときは wtf -v コマンドを使いましょう。直近の例外の完全な

  2. Rubyでカスタム例外を作成する方法【初心者向けガイド】

    Rubyでは、独自の例外クラスを簡単に作成できます。この記事では、カスタム例外を作るための基本的な手順を、コード例とともにわかりやすく解説します。 1. 新しいクラスを作成する Rubyにおいて、例外も他のオブジェクトと同じくクラスとして定義されています。新しい種類の例外を作りたい場合は、StandardError、あるいはそのサブクラスを継承したクラスを定義するだけでOKです。 class MyError < StandardError end raise MyError 慣例として、新しく作る例外クラスの名前は「Error」で終わるように命名します。また、カスタム例外をモジュ