Python docs状态:
程序可以通过创建新的异常来命名自己的异常 类(有关Python类的更多信息,请参见类)。例外情况 通常直接或直接从Exception类派生 间接地。
...
在创建可能引发多个明显错误的模块时, 常见的做法是为由定义的异常创建基类 该模块,以及创建特定异常类的子类 针对不同的错误情况。
来自Python’s super() considered super!:
每个级别都会剥离所需的关键字参数,以便 最终的空dict可以发送到不要求参数的方法 全部(例如,对象。 init 需要零个参数)
假设我有以下StudentValueError
和MissingStudentValue
例外。
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)
我想创建合作的例外。我有两个问题:
Exception
类的构造函数期望参数为零(空dict
),对吗? here提供的接受的答案继承自ValueError
。
答案 0 :(得分:0)
Exception
不包含关键字参数,它仅通过*args
包含可变数量的位置参数,因此您需要将**kwargs
更改为*args
。另外,我建议将message
和expression
与*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)