基本异常如何初始化?

时间:2016-10-17 16:35:39

标签: python python-3.x exception python-2.x

我对Python 3中的以下异常如何初始化感到困惑。

class MyException( Exception ):

    def __init__(self,msg,foo):
        self.foo = foo

raise MyException('this is msg',123)

在Python 3中,输出:

Traceback (most recent call last):
  File "exceptionTest.py", line 7, in <module>
    raise MyException('this is msg',123)
__main__.MyException: ('this is msg', 123)

参数如何初始化?我很惊讶,因为我没有调用超类初始化程序,所以引用显示了args。

在Python 2中,我得到以下输出,这对我来说更有意义,因为args不包含在回溯中。

Traceback (most recent call last):
  File "exceptionTest.py", line 7, in <module>
    raise MyException('this is msg',123)
__main__.MyException

1 个答案:

答案 0 :(得分:2)

Python BaseException类的特殊之处在于它有一个__new__方法专门用于处理这种常见的错误情况。

所以不,BaseException.__init__未被调用,但BaseException.__new__ 。您可以覆盖__new__并忽略传入的参数以取消self.args

的设置
>>> class MyException(Exception):
...     def __new__(cls, *args, **kw):
...         return super().__new__(cls)  # ignoring arguments
...     def __init__(self,msg,foo):
...         self.foo = foo
...
>>> MyException('this is msg', 123)  # no need to raise to see the result
MyException()

此添加内容特定于Python 3,在Python 2中不存在。有关动机和详细信息,请参阅issue #1692335