4

raiseを使用している私の例外クラスは次のとおりです。

class SCE(Exception):
    """
    An error while performing SCE functions.
    """
    def __init__(self, value=None):
        """
        Message: A string message or an iterable of strings.
        """
        if value is None:
            self._values = []
        elif isinstance(value, str):
            self._values = [value]
        else:
            self._values = list(value)

    def __raise__(self):
        print('raising')
        if not len(self._values):
            return

    def __str__(self):
        return self.__repr__()

    def __iter__(self):
        return iter(self._values)

    def __repr__(self):
        return repr(self._values)

現在、値なしでこの例外を発生させると、トレースバックに続いて次のようになります。

__main__.SCE: []

私が期待していたものの代わりに:

raising
>>>

どのようにオーバーロードしraiseますか?

4

3 に答える 3

3

他の答えが言うように、__raise__特別な方法はありません。2004 年に comp.lang.python で誰かがそのようなメソッドを追加することを提案したスレッドがありましたが、それに対するフォローアップはなかったと思います。例外の発生をフックする唯一の方法は、インタープリターにパッチを適用するか、発生操作の次に関数呼び出しを挿入するソースまたはバイトコードの書き換えのいずれかです。

于 2010-02-01T23:49:37.630 に答える
1

そのような特別な方法はありません__raise__(少なくとも、私が聞いたことがある、またはPython のドキュメントで見つけることができる方法はありません)。

なぜこれをしたいのですか?例外が発生したときにカスタムコードを実行したい理由は考えられません(__init__メソッドで実行できる例外が構築されたとき、または例外がキャッチされたときとは対照的です。ブロックで行いexceptます)。この動作の使用例は何ですか? また、Python がそれをサポートすると予想する理由は何ですか?

于 2010-02-01T23:31:00.007 に答える
0

他の人が述べているように、そのようなプライベートメソッドはありません__raise__。定義を妨げるものは何もありません。例えば:

#!/usr/bin/env python3


class MyClass(object):
    def __init__(self, raise_exceptions=False):
        self.raise_exceptions = raise_exceptions

    def __raise__(self, err=None):
        print(err, flush=True)
        if self.raise_exceptions:
            raise err

    def run(self):
        try:
            assert False, 'assertion False'
        except Exception as err:
            self.__raise__(err)


if __name__ == '__main__':
    MyClass(raise_exceptions=False).run()
    MyClass(raise_exceptions=True).run()

出力は次のとおりです。

$ python3 my_class.py
assertion False
assertion False
Traceback (most recent call last):
  File "my_class.py", line 22, in <module>
    MyClass(raise_exceptions=True).run()
  File "my_class.py", line 17, in run
    self.__raise__(err)
  File "my_class.py", line 11, in __raise__
    raise err
  File "my_class.py", line 15, in run
    assert False, 'assertion False'
AssertionError: assertion False

Process finished with exit code 1
于 2019-06-28T19:01:40.907 に答える