826 votes

Les exceptions qui dois-je augmenter sur bad/argument illégal combinaisons en Python?

Je me demandais à propos de les meilleures pratiques pour l'indication de l'argument non valide combinaisons en Python. Je suis venu à travers quelques situations où vous avez une fonction comme ceci:

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

Le seul ennui c'est que chaque paquet possède son propre, généralement légèrement différente BadValueError. Je sais qu'en Java il existe, java.lang.IllegalArgumentException -- est-il bien entendu que tout le monde va être la création de leur propre BadValueErrors en Python ou en est t-il une autre méthode préférée?

906voto

dbr Points 66401

Je voudrais juste raise ValueError, sauf si vous avez besoin d'un plus spécifiques exception..

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

Il n'y a vraiment pas de sens, class BadValueError(ValueError):pass - votre classe personnalisée est identique à l'utilisation de ValueError, alors pourquoi ne pas l'utiliser?

150voto

Markus Jarderot Points 33893

Je hériter de ValueError

class IllegalArgumentError(ValueError):
    pass

Il est parfois préférable de créer vos propres exceptions, mais héritent d'un construit-dans l'un, qui est aussi proche de ce que vous voulez que possible.

Si vous avez besoin de rattraper cette erreur spécifique, il est utile d'avoir un nom.

15voto

Eli Courtwright Points 53071

J'ai surtout vu le builtin ValueError utilisé dans cette situation.

-1voto

cdleary Points 18869

Je ne suis pas sûr que je suis d'accord avec l'héritage de ValueError -- mon interprétation de la documentation est qu' ValueError est seulement censé être soulevées par les builtins... héritant de celle-ci ou de l'élever vous-même semble incorrect.

Soulevée lors de la intégré dans le fonctionnement ou la la fonction reçoit un argument qui a le type de droit, mais inadapté à la valeur, et la situation n'est pas décrit par un plus précis exception comme IndexError.

-- ValueError documentation

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X