对用户定义的异常使用Exception .__ init __(self)

时间:2019-07-05 09:25:41

标签: python python-3.x exception

我一直在网上搜索以了解Exception.__init__(self)的用户定义异常的用法。

例如:

我有两个用户定义的例外,一个为Exception.__init__(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__

他们两个都在做类似的事情。我不明白其中的区别。

1 个答案:

答案 0 :(得分:2)

更正确的语法对于Python3是super().__init__()或对于Python2是super(MyFirstError, self).__init__()

通常在子类中重写__init__()时需要执行此操作,并且还需要调用基类构造函数。在您的特定情况下,调用没有参数的基本Exception构造函数没有任何好处,因为它没有做任何花哨的事情,但是您可能希望将result传递给Exception构造函数,这样您就不必保留{{ 1}}属于子类。

示例:

self.result

尽管如此,同样的事情也可以用更短的时间完成:

class MyFirstError(Exception):
    def __init__(self, result):
        super().__init__(result)  # will pass result as an argument to the base Exception class

由于您未实现构造函数,因此将隐式调用base Exception的class MyFirstError(Exception): pass 方法,以实现与上述完全相同的结果。