Python:我可以使用def __raise __(self)重载raise语句:?

时间:2010-02-01 23:21:35

标签: python raise

这是我的异常类使用 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

3 个答案:

答案 0 :(得分:3)

正如另一个答案所说,没有__raise__特殊方法。 2004年有一个关于comp.lang.python的帖子,其中有人建议添加这样的方法,但我认为没有任何跟进。我可以想到挂钩异常提升的唯一方法是修补解释器,或者在raise操作旁边插入一个函数调用的某种源代码或字节码重写。

答案 1 :(得分:1)

没有这样的特殊方法__raise__(至少没有我听说过或我可以在the Python documentation找到的)。

你为什么要这样做?我想不出为什么你想要在引发异常时执行自定义代码的任何原因(与构造异常时相反,可以使用__init__方法执行,或者异常是抓住了,您可以使用except块来执行此操作。这种行为的用例是什么,为什么期望Python支持它呢?

答案 2 :(得分: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