Python 异常的使用。用户定义异常的初始化(self)
我一直在网上搜索以了解Python 异常的使用。用户定义异常的初始化(self),python,python-3.x,exception,Python,Python 3.x,Exception,我一直在网上搜索以了解异常的用法。\uuu init\uuuu(self)用于用户定义的异常 例如: 我有两个用户定义的异常,一个是异常。\uuuu init\uuuuuu(self),第二个是没有 class MyFirstError(Exception): def __init__(self, result): Exception.__init__(self) self.result = result class MySecondError(Exce
异常的用法。\uuu init\uuuu(self)
用于用户定义的异常
例如:
我有两个用户定义的异常,一个是异常。\uuuu init\uuuuuu(self)
,第二个是没有
class MyFirstError(Exception):
def __init__(self, result):
Exception.__init__(self)
self.result = result
class MySecondError(Exception):
def __init__(self, result):
self.result = result
def test():
try:
raise MyFirstError("__My First Error__")
except MyFirstError as exc:
return exc.result
def test2():
try:
raise MySecondError("__ My Second Error__")
except MySecondError as exc:
return exc.result
if __name__ == "__main__":
print(test())
print(test2())
输出:
__My First Error__
__ My Second Error__
他们两人都在做相似的事情。我无法理解其中的区别。对于Python3来说,更正确的语法应该是
super()。\uuuu init\uuuu()
,或者对于Python2来说是super(MyFirstError,self)。\uuu init\uuuu()
通常在重写子类中的\uuuu init\uuu()
时执行此操作,并且还需要调用基类构造函数。在您的特定情况下,不带参数调用基本异常构造函数没有任何好处,因为它不会做任何花哨的事情,但是您可能希望将结果
传递给异常构造函数,这样您就不必将self.result
自己保存在子类中
例如:
class MyFirstError(Exception):
def __init__(self, result):
super().__init__(result) # will pass result as an argument to the base Exception class
不过,同样的事情也可以用更短的方式完成:
class MyFirstError(Exception): pass
由于没有实现构造函数,基本异常的
\uuuu init\uuu(result)
方法将被隐式调用,以获得与上述完全相同的结果。输出来自args
,它是在\uu new\uuuuu
中设置的,而不是\uuu init\uuu
。