在Python中实现'Exception.\uu str\uu()'
我从未完全理解Python(或任何语言)中的异常处理。我在尝试自定义异常,发现了以下行为在Python中实现'Exception.\uu str\uu()',python,python-3.x,exception,Python,Python 3.x,Exception,我从未完全理解Python(或任何语言)中的异常处理。我在尝试自定义异常,发现了以下行为 class MyError(Exception): def __init__(self, anything): pass me = MyError("iiiiii") print(me) 输出: iiiiii 我假设print()调用异常 基类Exception如何知道打印iii?字符串“iiiii”通过参数anything传递给MyError的构造函数,但是anything根
class MyError(Exception):
def __init__(self, anything):
pass
me = MyError("iiiiii")
print(me)
输出:
iiiiii
我假设print()
调用异常
基类Exception
如何知道打印iii
?字符串“iiiii”
通过参数anything
传递给MyError
的构造函数,但是anything
根本不存储在MyError
中的任何位置
此外,MyError
的构造函数不调用其超类(异常)构造函数。那么,print(me)
printiiii
?在Python3中,BaseException
类有一个\uuuuuuu新的方法,该方法将参数存储在self.args
中:
>>> me.args
('iiiiii',)
您没有重写\uuuu new\uuuu
方法,只有\uuuu init\uuuu
。您需要覆盖两者,以完全防止设置self.args
,因为两种实现都乐于设置该属性:
>>> class MyError(Exception):
... def __new__(cls, *args, **kw):
... return super().__new__(cls) # ignoring args and kwargs!
... def __init__(self, *args, **kw):
... super().__init__() # again ignoring args and kwargs
...
>>> me = MyError("iiiiii")
>>> me
MyError()
>>> print(me)
>>> me.args
()
在Python2中,异常不会实现\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,并且您的。请参阅添加\uuuu new\uuuu
方法的原因;基本上是为了避免像您这样的问题,\uuuuu init\uuu
方法不调用super()
请注意,\uuuuu init\uuuu
不是构造函数;到那时,实例已经由\uuuuu new\uuuu
构建<代码>\uuuu init\uuuu
仅仅是初始化器。什么版本的Python?这不能在Python2.7中复制。抱歉,忘了提到Python3.5.1。