我对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
答案 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。