Comment gérer correctement les exceptions dans les blocs try-except de Python ?

wind17 IN 📗 Étudiant 👁 39 ⚑ Signaler Programmation

Ça fait quelques années que je fais du Python et je suis toujours pas sûr si je dois capturer des exceptions spécifiques ou juste utiliser une clause except générale. Mon code actuel a beaucoup de gestionnaires d'exceptions génériques et je me demande si c'est vraiment une mauvaise pratique ou si c'est acceptable pour les petits projets.

2 réponses

★ Meilleure réponse

Qu'est-ce que ton code fait réellement quand ces exceptions arrivent - tu les enregistres, tu réessaies, ou tu continues juste silencieusement ?

La raison pour laquelle les gens insistent sur les exceptions spécifiques, c'est qu'un `except:` nu ou un `except Exception:` va attraper littéralement tout, y compris des trucs que tu n'anticipais pas et que tu devrais probablement pas ignorer. Genre si tu essaies d'ouvrir un fichier et que tu attrapes `FileNotFoundError`, c'est spécifique et ça a du sens. Mais un except nu va aussi attraper des trucs comme `KeyboardInterrupt` ou `SystemExit`, que tu veux généralement laisser passer. Pire encore, ça cache les bugs - si ton code a une typo ou une erreur de logique qui lève quelque chose d'inattendu, tu ne le verras jamais parce que la clause except l'a avalé.

Cela dit, pour les petits scripts ou les trucs rapides, les gens deviennent pragmatiques. La différence se voit vraiment quand tu débogues ou quand ton code est transmis à quelqu'un d'autre. Les exceptions spécifiques clarifient ton intention - ce code sait gérer un fichier manquant, mais pas un problème de connexion à la base de données. Si tu écris quelque chose qui va rester petit, attraper `Exception` (pas un except nu) c'est beaucoup plus sûr qu'un gestionnaire fourre-tout, et tu peux au moins voir ce qui est attrapé. À mesure que tes projets grandissent, tu voudras être plus spécifique. Le fait d'être délibéré sur ce que tu attrapes, c'est pas juste du pédantisme - ça t'épargne des bugs mystérieux plus tard.

wind17 asker Actuellement, je les enregistre simplement et je continue. C'est surtout des opérations de fichiers et des appels API dans de petits scripts, donc je n'ai pas encore rencontré de problèmes, mais je comprends ton point de vue sur les bugs cachés.

Les exceptions spécifiques valent mieux que les génériques parce que tu vas attraper les bugs que tu ne voulais pas étouffer - comme une typo dans un nom de variable qui lève `NameError`, qu'un `except:` nu va juste cacher au lieu de te laisser corriger le truc. Même pour les petits projets, cette habitude paie rapidement; tu peux toujours regrouper les exceptions liées comme `except (ValueError, TypeError):` si tu veux rester léger.

Le vrai piège que les gens contournent: `except:` nu attrape même les trucs comme `KeyboardInterrupt` et `SystemExit`, donc ton programme pourrait ignorer un Ctrl+C de l'utilisateur et continuer à tourner. Utilise `except Exception:` au minimum absolu si tu as vraiment besoin d'une capture générale, mais honnêtement, prends 30 secondes pour comprendre ce qui pourrait vraiment échouer et liste ça.

Votre réponse

Se connecterpour répondre.