Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中实现'Exception.\uu str\uu()'_Python_Python 3.x_Exception - Fatal编程技术网

在Python中实现'Exception.\uu str\uu()'

在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根

我从未完全理解Python(或任何语言)中的异常处理。我在尝试自定义异常,发现了以下行为

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)
print
iiii

在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。