Qu'est-ce que la gestion des exceptions ?
La gestion des exceptions permet à un programme de réagir aux erreurs qui surviennent pendant son exécution. Le code qui peut échouer va dans un bloc protégé, comme try, et quand une erreur est levée, le contrôle saute vers un gestionnaire, comme except ou catch, au lieu de planter.
Mis à jour le 24 septembre 2026
Un programme qui demande leur âge aux gens recevra tôt ou tard « twenty » au lieu de 20. Convertir ce texte provoque une erreur d'exécution : int("twenty") lève ValueError, et sans plan pour ce cas, le programme s'arrête. La gestion des exceptions, c'est ce plan. Tu marques le code qui peut échouer et tu écris le code qui s'exécute s'il échoue.
Next year you will be 35
Not a number: twenty
Next year you will be 20
Done
La mauvaise réponse est signalée, et la boucle continue avec la suivante. Sans le try, le programme aurait affiché une ligne, puis un traceback.
Comment fonctionne la gestion des exceptions
- Le code à l'intérieur du
trys'exécute normalement. - Une opération échoue, et le runtime lève une exception : un objet avec un type (
ValueError) et un message (invalid literal for int() with base 10: 'twenty'). - Le bloc
trys'arrête à cette ligne. Ses lignes restantes sont sautées, et c'est pour cela que « Next year you will be » n'est pas affiché pour « twenty ». - Le runtime compare le type de l'exception avec chaque clause
except, de haut en bas, et exécute la première qui correspond. - Une fois le gestionnaire terminé, le programme continue à la première ligne après l'instruction
trycomplète. - Si aucune clause ne correspond, l'exception quitte la fonction courante et la recherche continue dans la fonction qui l'a appelée, puis dans l'appelant de celle-ci. C'est ce qu'on appelle le déroulement de la pile d'appels. Si la recherche atteint le sommet du programme sans correspondance, le programme se termine avec un traceback.
L'étape 6 signifie que le gestionnaire n'a pas besoin d'être dans la fonction où l'erreur se produit. Ici, l'échec a lieu deux appels plus bas, et le gestionnaire en bas du fichier l'attrape quand même :
parsing 4.50
parsing free
Could not add the prices: could not convert string to float: 'free'
float("free") a échoué à l'intérieur de parse_price. Ni parse_price ni total n'avaient de gestionnaire, donc les deux ont été abandonnées, et « 3.20 » n'a jamais été analysé. C'est le principal choix de conception que te donne la gestion des exceptions : gérer une erreur là où tu sais quoi en faire, ce qui est souvent loin de l'endroit où elle s'est produite.
try, except, else et finally
L'instruction try de Python a deux parties facultatives de plus. else ne s'exécute que si le bloc try s'est terminé sans exception. finally s'exécute dans tous les cas : après un succès, après une exception gérée, et même quand la fonction retourne depuis l'intérieur du try.
no error
finally runs either way
2.0
b was zero
finally runs either way
None
finally est l'endroit du nettoyage : fermer un fichier, libérer un verrou, fermer une connexion à une base de données. En Python, l'instruction with fait ce nettoyage automatiquement pour les fichiers, et c'est le choix habituel dans ce cas.
Lever tes propres exceptions
Les exceptions ne servent pas qu'aux erreurs que le langage détecte. Quand ta propre fonction reçoit une entrée dont elle ne peut rien faire, elle peut lever une exception pour refuser, et l'appelant décide de la suite. Définir une petite classe d'exception donne à l'erreur un nom qui la décrit.
70
Refused: cannot take 250, balance is 100
Python utilise raise. Java, C++ et JavaScript utilisent throw pour la même chose.
La gestion des exceptions dans d'autres langages
| Langage | Mots-clés | Bon à savoir |
|---|---|---|
| Python | try, except, else, finally, raise | Chaque exception est un objet qui hérite de BaseException |
| Java | try, catch, finally, throw, throws | Les exceptions vérifiées comme IOException doivent être attrapées ou déclarées avec throws |
| C++ | try, catch, throw | Pas de finally ; les destructeurs nettoient pendant le déroulement de la pile |
| JavaScript | try, catch, finally, throw | Les erreurs du code async s'attrapent avec un try autour du await |
| C | aucun | Les fonctions renvoient un code d'erreur, et beaucoup définissent errno |
| Go | aucun pour les erreurs ordinaires | Les fonctions renvoient une valeur error que l'appelant vérifie |
Le même exemple de conversion ressemble à ceci en Java :
try {
int age = Integer.parseInt("twenty");
System.out.println(age + 1);
} catch (NumberFormatException e) {
System.out.println("Not a number: " + e.getMessage());
} finally {
System.out.println("done");
}
Java sépare les exceptions en deux groupes. Les exceptions vérifiées, comme IOException, décrivent des problèmes hors du contrôle du programme, et le compilateur refuse de construire un code qui ne les attrape pas et ne les déclare pas. Les exceptions non vérifiées, sous-classes de RuntimeException comme NullPointerException, signalent généralement un bug, et le compilateur ne t'oblige pas à les gérer.
Erreurs fréquentes
- Tout attraper. Un
except:nu en Python attrape aussiKeyboardInterrupt, donc Ctrl+C ne fonctionne plus, etexcept Exception:attrape des bugs que tu n'avais jamais prévus. Attrape le type précis que tu sais gérer. - Avaler l'erreur.
except ValueError: passcache le problème. Au minimum, affiche ou journalise ce qui s'est mal passé. - Un bloc
trytrop grand. N'enveloppe que les lignes qui peuvent lever l'exception que tu attrapes, pour qu'une erreur sans rapport ne soit pas gérée par erreur. - Attraper les bugs au lieu de les corriger. Un
IndexErrorvenant d'une boucle qui va un pas trop loin est une faute dans le code. Le gérer maintient en vie le code faux. - Compter sur
catchpour empêcher un plantage en C ou C++. Une segmentation fault est un signal du système d'exploitation, pas une exception, et sous Linux et macOS uncatch (...)C++ ne la voit jamais.
Pour aller plus loin
Les erreurs auxquelles répond la gestion des exceptions sont décrites sur la page erreur d'exécution, et le plantage qu'elle ne peut pas attraper sur la page segmentation fault. Pour la syntaxe complète, lis les guides sur les exceptions en Python, try et catch en Java, les exceptions en C++ et try et catch en JavaScript. Le cours Java et le cours Python les font pratiquer avec de vrais exercices.
Questions fréquentes
Quels sont les 5 mots-clés de la gestion des exceptions en Java ?
try, catch, finally, throw et throws. try marque le code à surveiller, catch gère un type d'exception précis, et finally exécute du code de nettoyage, qu'une exception se soit produite ou non. throw lève une exception, et throws, dans la signature d'une méthode, déclare quelles exceptions vérifiées la méthode peut transmettre à son appelant.Comment fonctionne la gestion des exceptions en C++ ?
try, catch et throw. On peut lancer n'importe quel type, mais par convention on lance un objet dérivé de std::exception, comme std::runtime_error, et on l'attrape par référence : catch (const std::exception& e). Le C++ n'a pas de finally ; le nettoyage se fait dans les destructeurs, qui s'exécutent automatiquement pendant le déroulement de la pile.Quelle est la différence entre une erreur et une exception ?
Exception couvre les problèmes qu'un programme peut raisonnablement gérer, tandis que Error, comme OutOfMemoryError ou StackOverflowError, signale une défaillance de la JVM qu'un programme ne devrait généralement pas essayer d'attraper. En Python, ValueError et ZeroDivisionError sont toutes deux des exceptions malgré leur nom.Quelle est la différence entre throw et throws en Java ?
throw est une instruction qui lève une exception à cet endroit : throw new IllegalArgumentException("negative age");. throws fait partie de la déclaration d'une méthode et liste les exceptions vérifiées que la méthode peut transmettre à son appelant : void load() throws IOException. Le compilateur oblige alors chaque appelant à attraper cette exception ou à la déclarer lui aussi.La gestion des exceptions ralentit-elle le code ?
try coûte peu dans la plupart des langages modernes. Depuis Python 3.11, un try ne coûte presque rien quand aucune exception n'est levée, et les principaux compilateurs C++ n'ajoutent aucun coût à l'exécution sur le chemin où rien n'est lancé. Lever et attraper une exception est bien plus lent qu'un test if, donc dans les boucles où la performance compte, vérifie les cas fréquents au lieu de compter sur les exceptions.