Какое исключение я должен поднять на неправильные / недопустимые комбинации аргументов в Python? - PullRequest
448 голосов
/ 02 ноября 2008

Мне было интересно узнать, как лучше всего указывать недопустимые комбинации аргументов в Python. Я сталкивался с несколькими ситуациями, когда у вас есть такая функция:

def import_to_orm(name, save=False, recurse=False):
    """
    :param name: Name of some external entity to import.
    :param save: Save the ORM object before returning.
    :param recurse: Attempt to import associated objects as well. Because you
        need the original object to have a key to relate to, save must be
        `True` for recurse to be `True`.
    :raise BadValueError: If `recurse and not save`.
    :return: The ORM object.
    """
    pass

Единственное раздражение при этом заключается в том, что каждый пакет имеет свой собственный, обычно немного различающийся BadValueError. Я знаю, что в Java существует java.lang.IllegalArgumentException - хорошо ли понятно, что каждый будет создавать свои собственные BadValueError в Python или есть другой, предпочтительный метод?

Ответы [ 6 ]

494 голосов
/ 02 ноября 2008

Я бы просто поднял ValueError , если только вам не нужно более конкретное исключение ..

def import_to_orm(name, save=False, recurse=False):
    if recurse and not save:
        raise ValueError("save must be True if recurse is True")

На самом деле нет смысла делать class BadValueError(ValueError):pass - ваш пользовательский класс идентичен в использовании ValueError , так почему бы не использовать это?

88 голосов
/ 02 ноября 2008

Я бы унаследовал от ValueError

class IllegalArgumentError(ValueError):
    pass

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

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

10 голосов
/ 01 августа 2018

Я думаю, что лучший способ справиться с этим - это то, как сам Python справляется с этим. Python вызывает ошибку TypeError. Например:

$ python -c 'print(sum())'
Traceback (most recent call last):
File "<string>", line 1, in <module>
TypeError: sum expected at least 1 arguments, got 0

Наш младший разработчик только что нашел эту страницу в поиске Google для "неправильных аргументов исключения Python", и я удивлен, что очевидный (для меня) ответ никогда не предлагался в течение десятилетия, так как этот вопрос был задан.

9 голосов
/ 02 ноября 2008

Я в основном только что видел встроенный ValueError, используемый в этой ситуации.

1 голос
/ 02 ноября 2008

Я не уверен, что согласен с наследованием от ValueError - моя интерпретация документации такова, что ValueError это только , который должен быть вызван встроенными функциями ... наследоваться от него или повысить это кажется неверным.

Поднимается, когда встроенная операция или Функция получает аргумент, который имеет правильный тип, но неуместный значение, а ситуация не описывается более точным исключением такой как IndexError.

- Документация ValueError

0 голосов
/ 05 октября 2017

Согласитесь с предложением Маркуса откатить ваше собственное исключение, но текст исключения должен прояснить, что проблема в списке аргументов, а не в значениях отдельных аргументов. Я бы предложил:

class BadCallError(ValueError):
    pass

Используется, когда отсутствуют аргументы ключевых слов, которые требовались для определенного вызова, или значения аргументов индивидуально действительны, но несовместимы друг с другом. ValueError все равно будет правильным, если определенный аргумент имеет правильный тип, но выходит за пределы диапазона.

Разве это не должно быть стандартным исключением в Python?

В целом, я бы хотел, чтобы стиль Python был немного более четким, чтобы отличать плохие входные данные для функции (ошибка вызывающего) от плохих результатов внутри функции (моя ошибка). Таким образом, может также существовать ошибка BadArgumentError, чтобы отличать значения ошибок в аргументах от ошибок значений в локальных элементах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...