Erreur Python : KeyError

NSI Première

Définition

La `KeyError` survient quand tu essaies d'accéder à une clé qui n'existe pas dans un dictionnaire. Python affiche un message du type `KeyError: 'nom_de_la_cle'`, où la valeur indiquée est précisément la clé introuvable. C'est l'équivalent, pour les dictionnaires, de l'`IndexError` des listes : tu demandes une entrée qui n'a jamais été créée (ou dont le nom est mal orthographié).

Exemple corrigé

Énoncé

Voici un code qui déclenche cette erreur :

```python
notes = {"Maths": 15, "NSI": 18, "Anglais": 12}

# On veut afficher la note de physique
print("Note en Physique :", notes["Physique"])
```

Exécution :

```
Traceback (most recent call last):
File "notes.py", line 4, in <module>
print("Note en Physique :", notes["Physique"])
KeyError: 'Physique'
```

Solution

La cause est simple : la clé `"Physique"` n'a jamais été ajoutée au dictionnaire `notes`. Comme elle n'existe pas, l'accès direct avec les crochets `notes["Physique"]` échoue.

Deux façons de corriger, selon le besoin :

1. Utiliser la méthode `.get()` qui renvoie une valeur par défaut au lieu de planter :

```python
notes = {"Maths": 15, "NSI": 18, "Anglais": 12}

# Renvoie "absente" si la clé n'existe pas, sans erreur
print("Note en Physique :", notes.get("Physique", "absente"))
```

2. Vérifier la présence de la clé avec `in` avant d'y accéder :

```python
if "Physique" in notes:
print("Note en Physique :", notes["Physique"])
else:
print("Pas de note en Physique.")
```

Le bon réflexe : quand tu n'es pas sûr qu'une clé existe, utilise `dico.get(cle, valeur_par_defaut)` ou teste avec `cle in dico` plutôt qu'un accès direct par crochets.

Erreurs classiques

  • Confondre `KeyError` (clé absente d'un dictionnaire) et `IndexError` (indice hors limites d'une liste) : ce sont deux structures différentes.
  • Une faute de frappe ou de casse dans le nom de la clé déclenche aussi l'erreur : `notes["maths"]` échoue si la clé enregistrée est `"Maths"` (Python distingue majuscules et minuscules).
  • Croire que `notes.get("Physique")` plante : non, sans valeur par défaut il renvoie `None` silencieusement, ce qui peut masquer un bug plus loin.

Toutes les notions