创建合作的例外

时间:2019-03-17 18:23:00

标签: python exception custom-exceptions

Python docs状态:

  

程序可以通过创建新的异常来命名自己的异常   类(有关Python类的更多信息,请参见类)。例外情况   通常直接或直接从Exception类派生   间接地。

...

  

在创建可能引发多个明显错误的模块时,   常见的做法是为由定义的异常创建基类   该模块,以及创建特定异常类的子类   针对不同的错误情况。

来自Python’s super() considered super!

  

每个级别都会剥离所需的关键字参数,以便   最终的空dict可以发送到不要求参数的方法   全部(例如,对象。 init 需要零个参数)

假设我有以下StudentValueErrorMissingStudentValue例外。

class StudentValueError(Exception):
    """Base class exceptions for Student Values"""
    def __init__(self, message, **kwargs):
        super().__init__(**kwargs)
        self.message = message # You must provide at least an error message.


class MissingStudentValue(StudentValueError):
    def __init__(self, expression, message, **kwargs):
        super().__init__(message, **kwargs)
        self.expression = expression

    def __str__(self):
        return "Message: {0} Parameters: {1}".format(self.message, self.expression)

我想创建合作的例外。我有两个问题:

  1. 在那种情况下,Exception类的构造函数期望参数为零(空dict),对吗?
  2. 我的示例是否违反LSP?

here提供的接受的答案继承自ValueError

1 个答案:

答案 0 :(得分:0)

Exception不包含关键字参数,它仅通过*args包含可变数量的位置参数,因此您需要将**kwargs更改为*args。另外,我建议将messageexpression*args一起传递给super()调用。毕竟,该示例可能不违反LSP:

class StudentValueError(Exception):
    """Base class exceptions for Student Values"""
    def __init__(self, message='', *args):
        super().__init__(message, *args)
        self.message = message 


class MissingStudentValue(StudentValueError):
    def __init__(self, message='', expression='', *args):
        super().__init__(message, expression, *args)
        self.expression = expression

    def __str__(self):
        return "Message: {0} Parameters: {1}".format(self.message, self.expression)


e = Exception('message', 'expression', 'yet_another_argument')
print(e)
e = StudentValueError('message', 'expression', 'yet_another_argument')
print(e)
e = MissingStudentValue('message', 'expression', 'yet_another_argument')
print(e)
e = MissingStudentValue()
print(e)