Python3,从自定义异常中调用super的__init __

时间:2018-09-26 04:22:21

标签: python python-3.x exception super

我已经在python 3中创建了自定义异常,并且所有代码都能正常工作。但是我无法绕过的一件事就是为什么我需要将消息发送到Exception类的 __ init __(),以及如何将Custom异常转换为该字符串消息当我尝试打印异常时,因为Exception甚至BaseException中的代码执行的都不多。

不太了解为什么要通过自定义异常调用 super().__ init __()吗?

2 个答案:

答案 0 :(得分:1)

这是为了使您的自定义异常可以从与BaseException对象相同的实例属性开始,包括value属性,该属性存储异常消息,某些其他方法需要此属性例如__str__,它允许将异常对象直接转换为字符串。您可以跳过子类的super().__init__中的__init__调用,而是根据需要自行初始化所有必需的属性,但是那样一来,您就不会利用类继承的主要好处之一。除非您有非常特殊的理由不重复使用任何父类的实例属性,否则请始终调用super().__init__

答案 1 :(得分:0)

比兹利,大卫。 Python食谱(p.578)。 O'Reilly Media。

如果您要定义一个新的异常来覆盖 init ()Exception方法,请确保始终使用所有传递的参数调用Exception。 init ()。例如: class CustomError(Exception):

def __init__(self, message, status):
    super().__init__(message, status)
    self.message = message
    self.status = status 

这可能看起来有些怪异,但是Exception的默认行为 是接受所有传递的参数并将其存储在.args中 属性作为元组。 Python的其他各种库和部分 期望所有异常都具有.args属性,因此,如果跳过此 步骤,您可能会发现新的异常行为不完全 在某些情况下是正确的。为了说明.args的使用,请考虑 具有内置RuntimeError异常的此交互式会话,以及 注意加薪如何使用任意数量的参数 声明:

菲利普斯,尘土飞扬。 Python 3面向对象的编程:在Python 3.8,第三版(p。119)中使用面向对象的设计模式构建功能强大且可维护的软件

class AuthException(Exception): 
    def __init__(self, username, user=None): 
        super().__init__(username, user) 
        self.username = username 
        self.user = user 

class UsernameAlreadyExists(AuthException): 
    pass 

class PasswordTooShort(AuthExceptio)
    pass

我必须指出,与其传递通过,不如在Luciano Ramalho的建议下在此处添加字符串文档会更好

让我们看看它的用途


class Authenticator:
    def __init__(self):
        """Construct an authenticator to manage
        users logging in and out."""
        self.users = {}
 def add_user(self, username, password):
        if username in self.users:
            raise UsernameAlreadyExists(username)
        if len(password) < 6:
            raise PasswordTooShort(username)
        self.users[username] = User(username, password)

希望这会有所帮助