0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Python] Exception継承でエラーに応じてメッセージやステータスコードを使い分ける方法

Last updated at Posted at 2023-10-02

初めに

エラーハンドリングは、エラーの内容ごとに異なる処理を行う必要があります。例えば、ステータスコードやエラーコードは内容ごとに出力します。
今回は、デフォルトの場合とタイムアウトの場合に、特定のエラーコードとメッセージを出力させるようにしました。

カスタムクラスの定義

class CustomExceptionBase(Exception):
    STATUS_CODE: int = None
    DEFAULT_MESSAGE: str = "デフォルトメッセージです"

    def __init__(self, msg=None, *args, **kwargs):
        if not msg:
            msg = self.DEFAULT_MESSAGE_CODE

        super().__init__(msg, *args, **kwargs)


class TimeOutException(CustomExceptionBase):
    STATUS_CODE = 403
    DEFAULT_MESSAGE = "Time out error!!"

まず、CustomExceptionBaseクラスにExceptionクラスを継承させることで、カスタム例外クラスの基底クラスとして定義します。
サブクラスのTimeOutExceptionクラスに基底クラスを継承して属性をオーバーライドすることで、タイムアウトエラー時にSTATUS_CODEを403、DEFAULT_MESSAGEがTime out error!!と出力することができます。

使用例


try:
    ...

    try:
        requests.get("hoge/hoge")
    except requests.exceptions.Timeout:
        raise TimeOutException()

except CustomExceptionBase as e:
    return {
            "statusCode": e.STATUS_CODE,
            "body": "message": str(e),
            "headers": hogehoge,
        }

  1. get関数実行時のタイムアウトエラーの場合、raise
    TimeOutExceptionクラスを実行します。
  2. STATUS_CODEとDEFAULT_MESSAGE_CODEがオーバーライドされます
  3. 最終的にraiseをexceptでキャッチします。e.STATUS_CODEでSTATUS_CODE属性を使用し、str(e)で設定したエラーメッセージを使用しています。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?