169 votes

Python: est-ce une mauvaise forme de lever des exceptions dans __init__?

Est-ce considéré comme une mauvaise forme de créer des exceptions dans __init_? Si tel est le cas, quelle est la méthode acceptée pour générer une erreur lorsque certaines variables de classe sont initialisées avec la valeur None ou avec un type incorrect?

215voto

John Millikin Points 86775

Augmenter les exceptions entre __init__() est tout à fait correct. Il n'y a pas d'autre moyen efficace d'indiquer une condition d'erreur dans un constructeur, et il existe plusieurs centaines d'exemples dans la bibliothèque standard où la construction d'un objet peut générer une exception.

La classe d'erreur à soulever, bien sûr, dépend de vous. ValueError est préférable si un paramètre non valide a été transmis au constructeur.

38voto

senarvi Points 414

Il est vrai que la seule manière pour indiquer une erreur dans un constructeur est le déclenchement d'une exception. C'est pourquoi, en C++ et autres langages orientés objet, qui ont été conçus à l'exception de la sécurité à l'esprit, le destructeur n'est pas appelée si une exception est levée dans le constructeur d'un objet (ce qui signifie que l'initialisation de l'objet est incomplet). Ce n'est pas souvent le cas dans les langages de script comme Python. Par exemple, le code suivant génère une AttributeError si le socket.connect() échoue:

class NetworkInterface:
    def __init__(self, address)
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.connect(address)
        self.stream = self.socket.makefile()

    def __del__(self)
        self.stream.close()
        self.socket.close()

La raison en est que le destructeur de l'incomplétude de l'objet est appelé après la tentative de connexion a échoué, avant que le flux de l'attribut a été initialisé. Vous ne devriez pas éviter de jeter des exceptions de constructeurs, je dis juste que c'est difficile d'écrire entièrement exception coffre-fort à code en Python. Certains développeurs Python éviter d'utiliser des destructeurs, mais c'est une question d'un autre débat.

11voto

Edan Maor Points 4491

Je ne vois aucune raison pour que ce soit une mauvaise forme.

Au contraire, l’une des exceptions notoires est bien connue, par opposition au renvoi de codes d’erreur, c’est que les codes d’erreur ne peuvent généralement pas être renvoyés par les constructeurs. Ainsi, du moins dans des langages tels que C ++, le déclenchement d'exceptions est le seul moyen de signaler des erreurs.

9voto

sth Points 91594

La bibliothèque standard dit:

 >>> f = file("notexisting.txt")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'notexisting.txt'
 

De plus, je ne vois pas vraiment pourquoi cela devrait être considéré comme une mauvaise forme.

4voto

Teddy Points 3250

Je devrais penser que c'est le cas parfait pour l'exception intégrée ValueError .

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