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?
Réponses
Trop de publicités? 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.
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.
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.