Создание исключений, которые являются кооперативными - PullRequest
1 голос
/ 17 марта 2019

Состояние Python docs :

Программы могут называть собственные исключения, создавая новый класс исключений (подробнее о классах Python см. В разделе Классы).Исключения, как правило, должны быть получены из класса Exception, прямо или косвенно.

...

При создании модуля, который может вызвать несколько различных ошибок, распространенной практикой являетсясоздать базовый класс для исключений, определенных этим модулем, и создать подкласс для создания определенных классов исключений для различных условий ошибки.

Из Python super () считается супер! :

Каждый уровень отбирает необходимые ему ключевые аргументы, чтобы окончательный пустой dict мог быть отправлен в метод, который вообще не ожидает никаких аргументов (например, object. 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)

Я хочу создать совместимые исключения.У меня есть два вопроса:

  1. В этом случае конструктор класса Exception ожидает нулевые аргументы (пусто dict), верно?
  2. Мой пример нарушает LSP?

Принятый ответ при условии здесь наследуется от ValueError.

1 Ответ

0 голосов
/ 17 марта 2019

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...