Pythonでユーザー定義例外を作成する際のTips

環境

  • Windows 10
  • Python 3.10.1
  • VSCode

使用するソースコード

以下の公開リポジトリに置いています

GitHub - masayan1126/tao-py-py: 作業自動化用 Python ライブラリ
作業自動化用 Python ライブラリ. Contribute to masayan1126/tao-py-py development by creating an account on GitHub.

結論

結論からにはなりますが、以下のルールで作成する必要があります。

  1. Exceptionクラスが親クラスになるように作成する
    なお、Exceptionクラスを直接継承する必要はないが、Exceptionクラスのサブクラスを継承するようにすること
  2. 例外クラスの名称は~Errorとなるように作成する
  3. 必要に応じて、コンストラクタや__str__を実装する
    ※__str__ は例外オブジェクトをプリントしたときに表示される文字列を指定するためのメソッド
  4. 例外を送出するクラスでは、raiseを使用することで例外をスローすることができる

上記を踏まえ、以下のような空文字を許容しない例外クラスを作成するとする。

※詳細は以下を参照

8. エラーと例外 — Python 3.6.15 ドキュメント
class EmptyStringError(Exception):
    def __init__(self, msg):
        self._msg = msg

    def __str__(self):
        return self._msg

使用例

Xstrクラスはインスタンス生成時に文字列を引数にとり、空文字の場合は、上記で作成したEmptyStringErrorが送出されるように実装しています

packages\test.py

  • 例外をcatchする箇所で、EmptyStringError as eとすることで、eの中からエラーメッセージやクラス名等を取り出すことが可能
from shared.Domain.xstr import XStr
from shared.Exception.empty_string_error import EmptyStringError
from shared.x_logger import XLogger

try:
    xstr = XStr("")
except EmptyStringError as e:
    print(e._msg)
    XLogger.exceptionToSlack(e._msg)
shared\Domain\xstr.py
from shared.base_class import BaseClass
from shared.Exception.empty_string_error import EmptyStringError

class XStr(BaseClass):
    def __init__(self, string: str):
        if not isinstance(string, str):
            raise TypeError
        # 空文字の場合
        if len(string) == 0:
            raise EmptyStringError("空文字は指定できません")

        self.string = string

送出されたエラーはslackに通知するようにしているので、下記のようなエラーメッセージが通知されます

Pythonでslack_log_handlerを使用してログをslackに通知する
本記事では、Pythonでslack_log_handlerを使用してログをslackに通知する際のプログラム例や設定方法について紹介しています

Python学習におすすめの書籍

独習Python/山田祥寛【3000円以上送料無料】
bookfan 1号店 楽天市場店
¥ 3,300(2022/08/04 17:32時点)
タイトルとURLをコピーしました