Erreurs, exceptions et tests
Se connecter pour s'inscrireVotre progression
Syllabus
-
-
Objectifs
-
Validations de compétences
-
Public cible
Aucun public cible spécifié pour ce module.
-
Besoins techniques
-
Prérequis
- Aucun prérequis
-
Niveau
-
Historique du module
Aucune action enregistrée
Erreurs, exceptions et tests
-
Exceptions
Un programme échoue : on ne supprime pas l'erreur, on la traite au bon endroit.
try/exceptsert à anticiper un échec attendu, pas à tout attraper.def lire_nombre(): saisie = input("Un nombre : ") try: return int(saisie) except ValueError: print("Ce n'est pas un nombre entier, recommencez.") return NoneCapter juste ce qui peut échouer
# TROP LARGE : masque les vraies erreurs de logique try: traitement(utilisateur) except Exception: pass # JUSTE : on ne traite que l'échec prévu try: resultat = 10 / diviseur except ZeroDivisionError: resultat = NoneLever, propager, documenter
def retirer(compte, montant): if montant <= 0: raise ValueError("le montant doit être positif") if montant > compte.solde: raise ValueError("solde insuffisant") compte.deposer(-montant)raisesignale une situation impossible à contourner. Dans une bibliothèque, on laisse remonter l'exception : l'appelant décidera.finally et gestionnaires de contexte
fichier = None try: fichier = open("data.txt", encoding="utf-8") contenu = fichier.read() except FileNotFoundError: print("fichier absent") else: print(f"{len(contenu)} caractères") finally: if fichier is not None: fichier.close()En pratique, le
withremplace cetry/finallyet gère aussi l'echec. Et un objet qui se ferme tout seul peut être écrit avec__enter__et__exit__.Créer sa propre exception
class SoldeInsuffisant(Exception): def __init__(self, manquant: float): self.manquant = manquant super().__init__(f"il manque {manquant:.2f}") -
Tests automatisés
Un test vérifie une seule chose et échoue clairement. La bibliothèque standard
unittestsuffit, sans dépendance supplémentaire.import unittest class TestCompteBancaire(unittest.TestCase): def setUp(self): # exécuté avant chaque test : on repart d'un état propre self.compte = CompteBancaire("Alice", 100.0) def test_depot_ajoute_au_solde(self): self.compte.deposer(50.0) self.assertEqual(self.compte.solde, 150.0) def test_montant_negatif_refuse(self): self.assertFalse(self.compte.deposer(-10.0)) self.assertEqual(self.compte.solde, 100.0) def test_solde_vide_leve_une_erreur(self): with self.assertRaises(ValueError): moyenne([])Les assertions utiles
assertEqual,assertTrue,assertIs(identité, pourNone)assertIn,assertAlmostEqualpour les flottantsassertRaisesquand on attend une erreur
Ce qui rend un test utile
- Un nom qui dit ce qui est vérifié
(
test_montant_negatif_refuse). - Un seul comportement par test : sinon le diagnostic est impossible.
- Les cas limites : vide, zéro, négatif, accents, très grand nombre d'éléments.
Exécuter
python -m unittest discover -v python -m unittest tests.test_calculs -
Exercices
- Conversion sécurisée : écrivez
vers_entier(texte)qui renvoie un entier ouNone, et n'utilisez jamaisexcept:seul. - Tester avant de corriger : écrivez trois tests qui échouent sur la version actuelle d'une de vos fonctions, puis corrigez-la. C'est l'ordre professionnel : on ne corrige pas à l'aveugle.
- Contexte personnalisé : écrivez une classe
Fichierutilisable avecwith, qui ouvre le fichier et le ferme automatiquement.
- Conversion sécurisée : écrivez