Je préfère généralement gérer les exceptions en interne (c'est-à-dire essayer/excepter à l'intérieur de la fonction appelée, en retournant éventuellement un None) parce que Python est dynamiquement typé. En général, je considère que c'est une question de jugement dans un sens ou dans l'autre, mais dans un langage à typage dynamique, il y a de petits facteurs qui font pencher la balance en faveur de ne pas passer l'exception à l'appelant :
- Toute personne appelant votre fonction n'est pas informée des exceptions qui peuvent être lancées. Cela devient un peu un art de savoir quel type d'exception vous recherchez (et les blocs génériques excepté doivent être évités).
-
if val is None
est un peu plus facile que except ComplicatedCustomExceptionThatHadToBeImportedFromSomeNameSpace
. Sérieusement, je déteste devoir me rappeler de taper from django.core.exceptions import ObjectDoesNotExist
au début de tous mes fichiers django, juste pour gérer un cas d'utilisation très courant. Dans un monde statiquement typé, laissez l'éditeur le faire pour vous.
Honnêtement, c'est toujours une question de jugement, et la situation que vous décrivez, où la fonction appelée reçoit une erreur qu'elle ne peut pas aider, est une excellente raison de relancer une exception qui est significative. Vous avez exactement la bonne idée, mais à moins que votre exception ne fournisse des informations plus significatives dans une trace de pile que
AttributeError: 'NoneType' object has no attribute 'foo'
qui, neuf fois sur dix, est ce que l'appelant verra si vous renvoyez un None non géré, ne vous embêtez pas.
(Tout ceci me fait souhaiter que les exceptions python aient la fonction cause
par défaut, comme en java, qui vous permet de passer des exceptions dans de nouvelles exceptions, de sorte que vous pouvez relancer autant que vous voulez sans jamais perdre la source originale du problème).
0 votes
Similaire : stackoverflow.com/questions/1152541/
3 votes
Je penche pour la levée d'une exception afin d'être obligé de gérer l'exception dans la fonction appelante. Si j'oublie de vérifier si la sortie est None dans la fonction appelante, je pourrais avoir un bug latent. Si vous avez renvoyé None, la ligne suivante de la fonction appelante lèvera une AttributeError. Cependant, si la valeur renvoyée est ajoutée à un dictionnaire et que 100 appels de fonction dans un fichier source différent soulèvent une AttributeError, vous vous amuserez à chercher pourquoi cette valeur était None.
0 votes
En général, j'évite également les valeurs qui ont une signification particulière ou qui ont plusieurs signatures pour une même fonction (elle pourrait renvoyer une chaîne de caractères ou None).