首页 > 解决方案 > 创建合作的例外

问题描述

Python文档状态:

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

...

在创建一个可能引发多个不同错误的模块时,一种常见的做法是为该模块定义的异常创建一个基类,并为其创建子类以针对不同的错误条件创建特定的异常类。

Python 的 super() 被认为是超级!

每个级别都会剥离它需要的关键字参数,以便可以将最终的空字典发送到根本不需要参数的方法(例如,object.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?

此处提供的已接受答案继承自ValueError.

标签: pythonexceptioncustom-exceptions

解决方案


Exception不接受关键字参数,它只接受可变数量的位置参数 via *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)

推荐阅读