Du bon usage des exceptions: quand les utiliser

Le
Xavier Maillard
Salut,

au boulot, la règle est généralement d'utiliser des scripts
shells. Pour le dernier projet sur lequel je travaille, vu les délais,
on m'a autorisé à utiliser Python. C'est effectivement un réel gain de
temps en développement grâce au côté "batteries included".

Cependant, en shell, la plupart des concepts du Python sont
inexistants notamment la notion d'exception. En shell, je faisais
beaucoup tests de codes retour pour savoir quoi faire ensuite. Python
est beaucoup plus souple (trop ? :)) mais je me demande comment
utiliser efficacement les mécanisme des exceptions.

Quand est-il nécessaire de provoquer des "raise MonException" par
exemple ? Où utiliser principalement les try-except-else pour que ce
soit *vraiment* utile ? Est-il important d'avoir nos propres
exceptions et ne pas dépendre de celles existantes ? Est-ce que
provoquer la sortie prématurer d'un script Python par un sys.exit est
déconseillé (ce que je fais en shell au final) ?

Bref, vous voyez à peu près ce que je veux dire, j'espère.

Merci

Xavier
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Bruno Desthuilliers
Le #19355801
Xavier Maillard a écrit :
Salut,

au boulot, la règle est généralement d'utiliser des scripts
shells. Pour le dernier projet sur lequel je travaille, vu les délais,
on m'a autorisé à utiliser Python. C'est effectivement un réel gain de
temps en développement grâce au côté "batteries included".

Cependant, en shell, la plupart des concepts du Python sont
inexistants notamment la notion d'exception. En shell, je faisais
beaucoup tests de codes retour pour savoir quoi faire ensuite. Python
est beaucoup plus souple (trop ? :)) mais je me demande comment
utiliser efficacement les mécanisme des exceptions.

Quand est-il nécessaire de provoquer des "raise MonException" par
exemple ?



Dans le corps d'une fonction quand quelque chose n'est pas ok et que ça
ne peut pas ou n'a pas à être géré à ce niveau là. Ca permet de se
concentrer sur ce que doit effectivement faire cette fonction, et de
laisser l'appelant gérer comme il l'entend les problèmes que le concerne
lui.

Où utiliser principalement les try-except-else pour que ce
soit *vraiment* utile ?



Là où tu peux faire quelque chose pour gérer le problème.

Est-il important d'avoir nos propres
exceptions et ne pas dépendre de celles existantes ?



Ca dépend du contexte. Mais si c'est juste pour remplacer une exception
existante par la tienne (et perdre le traceback au passage), c'est pas
la peine.

Est-ce que
provoquer la sortie prématurer d'un script Python par un sys.exit est
déconseillé



Une exception non gérée provoquera de toutes façon la fin de
l'exécution. D'une manière générale, n'utilise pas sys.exit dans le code
d'un module, ce devrait être réservé au code se situant au plus haut
niveau d'une application (point d'entrée du programme, ou fonction
'satellite' appelée uniquement à ce niveau là, et explicitement prévue
pour).

L'"architecture" conseillée est d'avoir un gestionnaire d'exception
"attrape-tout" au niveau supérieur du programme qui journalise les
exceptions non gérées d'une façon ou d'une autre (log, mail,
whatever...), affiche un message d'erreur "convivial" pour
l'utilisateur, et appelle essaie de terminer le processus à peu près
proprement (généralement en appelant sys.exit... qui accessoirement
fonctionne en lançant une exception).

Après, pour un simple script dont tu es toi-même l'utilisateur final, tu
peux aussi bien laisser le gestionnaire d'exception par défaut faire son
travail, à savoir terminer l'exécution avec un beau traceback.
Xavier Maillard
Le #19356401
Un grand merci pour ces explications limpides.

Je sens que je vais devoir faire du ménage dans mon module.

Xavier
Publicité
Poster une réponse
Anonyme