1. ホーム
  2. python

[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?

2022-03-15 21:37:51

質問

現代のPythonでカスタム例外クラスを宣言する適切な方法は何でしょうか?私の主な目標は、他の例外クラスが持っているどんな標準にも従うことであり、(例えば)私が例外に含める余分な文字列は、例外をキャッチしたどんなツールによっても出力されます。

Python 2.5で動作し、Python 2.6とPython 3.*のやり方に「正しい」ものであることを意味します。また、quot;custom" というのは Exception このオブジェクトには、エラーの原因に関する追加データ(文字列や、例外に関連する他の任意のオブジェクト)を含めることができます。

Python 2.6.2の以下の非推奨の警告でつまづいた。

>>> class MyError(Exception):
...     def __init__(self, message):
...         self.message = message
... 
>>> MyError("foo")
_sandbox.py:3: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6

というのはおかしいと思う。 BaseException という名前の属性には、特別な意味があります。 message . 私は PEP-352 この属性は2.5では特別な意味を持っていましたが、非推奨にしようとしているので、その名前(とその1つだけ)はもう禁止されているのではないでしょうか?うう。

また、曖昧な認識ですが Exception は、何らかのマジックパラメータ args しかし、私はその使い方を知りません。私がネットで見つけた多くの議論は、Python 3で引数をなくそうとしていることを示唆していました。

更新:2つの回答が __init__ であり、かつ __str__ / __unicode__ / __repr__ . 入力が多いようですが、必要なのでしょうか?

どのように解決するのですか?

質問を聞き逃したかもしれませんが、なぜでしょう。

class MyException(Exception):
    pass

何かをオーバーライドする(あるいは追加の引数を渡す)には、次のようにします。

class ValidationError(Exception):
    def __init__(self, message, errors):            
        # Call the base class constructor with the parameters it needs
        super().__init__(message)
            
        # Now for your custom code...
        self.errors = errors

この方法では、2 番目のパラメータにエラーメッセージのディクショ ンを渡し、後でそれを e.errors .

Python 2 では、この少し複雑な形式の super() :

super(ValidationError, self).__init__(message)