Chapitre 4 : Erreurs et bonnes pratiques¶
Programme officiel (B.O.)¶
B.O. spécial n° 1 du 22 janvier 2019 - SNT Seconde
| Contenus | Capacités attendues |
|---|---|
| Affectations, variables | Écrire et développer des programmes avec des variables. |
| Séquences d'instructions | Comprendre et écrire une suite ordonnée d'instructions. |
Instructions conditionnelles (if, elif, else) |
Programmer des choix dans un algorithme. |
Boucles bornées (for) et non bornées (while) |
Programmer des répétitions. |
| Définitions et appels de fonctions | Décomposer un programme en fonctions réutilisables. |
9. Les erreurs en Python - Guide complet¶
Apprendre à lire et comprendre les messages d'erreur est une compétence essentielle. Python affiche toujours un message qui indique :
- Où l'erreur s'est produite (numéro de ligne)
- Quel type d'erreur c'est
- Un message explicatif
9.1. Lire un message d'erreur (traceback)¶
Traceback (most recent call last):
File "mon_programme.py", line 3, in <module>
print(age + " ans")
~~~~^~~~~~~~
TypeError: unsupported operand type(s) for +: 'int' and 'str'
- Ligne 1 : début du traceback (remontée de l'erreur)
- Ligne 2 : fichier et numéro de ligne concernés
- Ligne 3 : la ligne de code fautive
- Ligne 4 : une flèche pointant vers l'endroit exact de l'erreur
- Ligne 5 : le type d'erreur et son explication
9.2. Les erreurs de syntaxe - SyntaxError¶
Python ne peut même pas démarrer l'exécution du programme car le code est mal écrit :
# ❌ Oubli du deux-points
if age >= 18
print("Majeur")
# SyntaxError: expected ':'
# ❌ Oubli d'une parenthèse fermante
print("Bonjour"
# SyntaxError: '(' was never closed
# ❌ Oubli d'un guillemet fermant
nom = "Alice
# SyntaxError: unterminated string literal
# ❌ Utilisation d'un mot réservé comme variable
class = "2nde B"
# SyntaxError: invalid syntax
# ❌ Oubli du = dans une affectation
if age = 18:
# SyntaxError: invalid syntax. Maybe you meant '==' or ':='?
9.3. Les erreurs d'indentation - IndentationError¶
# ❌ Bloc non indenté
if True:
print("Bonjour")
# IndentationError: expected an indented block after 'if' statement
# ❌ Indentation inattendue
x = 5
y = 10
# IndentationError: unexpected indent
# ❌ Mélange tabulations et espaces (très sournois !)
if True:
print("tab") # tabulé
print("espaces") # 4 espaces
# IndentationError: unindent does not match any outer indentation level
Conseil
Configurez votre éditeur pour toujours utiliser 4 espaces (pas de tabulations). Dans Thonny, c'est le réglage par défaut.
9.4. Les erreurs de nom - NameError¶
La variable ou la fonction n'existe pas dans le contexte actuel :
# ❌ Variable pas encore définie
print(resultat)
# NameError: name 'resultat' is not defined
# ❌ Faute de frappe
age_eleve = 16
print(age_elve) # 'elve' au lieu de 'eleve'
# NameError: name 'age_elve' is not defined
# ❌ Oubli des guillemets autour d'un texte
print(Bonjour)
# NameError: name 'Bonjour' is not defined
# ❌ Variable locale utilisée hors de la fonction
def ma_fonction():
resultat = 42
ma_fonction()
print(resultat)
# NameError: name 'resultat' is not defined
9.5. Les erreurs de type - TypeError¶
On essaie de faire une opération incompatible avec le type des données :
# ❌ Additionner un nombre et une chaîne
print(5 + "3")
# TypeError: unsupported operand type(s) for +: 'int' and 'str'
# ❌ Concaténer un nombre à une chaîne
print("J'ai " + 16 + " ans")
# TypeError: can only concatenate str (not "int") to str
# ❌ Multiplier deux chaînes
print("abc" * "def")
# TypeError: can't multiply sequence by non-int of type 'str'
# ❌ Appeler quelque chose qui n'est pas une fonction
x = 5
x()
# TypeError: 'int' object is not callable
# ❌ Utiliser len() sur un nombre
len(42)
# TypeError: object of type 'int' has no len()
9.6. Les erreurs de valeur - ValueError¶
La valeur n'est pas adaptée, même si le type est correct :
# ❌ Convertir un texte en nombre
int("abc")
# ValueError: invalid literal for int() with base 10: 'abc'
# ❌ Convertir un décimal en int directement
int("3.14")
# ValueError: invalid literal for int() with base 10: '3.14'
# ❌ Chercher un élément absent d'une liste
[1, 2, 3].index(5)
# ValueError: 5 is not in list
9.7. Les erreurs d'indice - IndexError¶
On accède à un indice qui n'existe pas :
notes = [15, 12, 18]
notes[3]
# IndexError: list index out of range
# Les indices valides sont 0, 1, 2 (ou -1, -2, -3)
notes[10]
# IndexError: list index out of range
# ❌ Erreur classique avec range
for i in range(len(notes) + 1): # range va jusqu'à 3, mais l'indice 3 n'existe pas
print(notes[i])
# IndexError: list index out of range
9.8. La division par zéro - ZeroDivisionError¶
print(10 / 0)
# ZeroDivisionError: division by zero
print(10 // 0)
# ZeroDivisionError: integer division or modulo by zero
print(10 % 0)
# ZeroDivisionError: integer division or modulo by zero
9.9. Tableau récapitulatif des erreurs¶
| Erreur | Cause courante | Comment corriger |
|---|---|---|
SyntaxError |
Oubli de :, parenthèse, guillemet |
Relire la ligne indiquée, vérifier la ponctuation |
IndentationError |
Mauvaise indentation ou mélange tab/espaces | Aligner les blocs à 4 espaces |
NameError |
Variable inexistante, faute de frappe, oubli de "" |
Vérifier le nom, l'ordre des instructions |
TypeError |
Opération entre types incompatibles | Convertir avec int(), float(), str() |
ValueError |
Conversion impossible (int("abc")) |
Vérifier la valeur avant de convertir |
IndexError |
Indice hors limites d'une liste | Vérifier len() et les bornes de range() |
ZeroDivisionError |
Division par zéro | Tester if diviseur != 0 avant de diviser |
10. Plusieurs façons de faire la même chose¶
En programmation, il existe souvent plusieurs approches pour résoudre un même problème. Voici les plus courantes.
10.1. Construire une chaîne de caractères¶
nom = "Alice"
age = 16
# Méthode 1 : concaténation avec +
message = "Je m'appelle " + nom + " et j'ai " + str(age) + " ans."
# Méthode 2 : virgules dans print()
print("Je m'appelle", nom, "et j'ai", age, "ans.")
# Méthode 3 : f-string (recommandée ✅)
message = f"Je m'appelle {nom} et j'ai {age} ans."
# Méthode 4 : .format()
message = "Je m'appelle {} et j'ai {} ans.".format(nom, age)
10.2. Tester si un élément est dans une collection¶
voyelles = "aeiouy"
lettre = "e"
# Méthode 1 : avec in (recommandée ✅)
if lettre in voyelles:
print("C'est une voyelle")
# Méthode 2 : avec une boucle
est_voyelle = False
for v in voyelles:
if lettre == v:
est_voyelle = True
if est_voyelle:
print("C'est une voyelle")
# Méthode 3 : avec or (fastidieux mais explicite)
if lettre == "a" or lettre == "e" or lettre == "i":
print("C'est une voyelle")
10.3. Calculer une somme¶
nombres = [3, 7, 2, 9, 4]
# Méthode 1 : boucle for avec accumulateur
total = 0
for n in nombres:
total += n
# Méthode 2 : fonction intégrée sum() (recommandée ✅)
total = sum(nombres)
# Méthode 3 : boucle while
total = 0
i = 0
while i < len(nombres):
total += nombres[i]
i += 1
10.4. Créer une liste de nombres¶
# Méthode 1 : boucle for avec append
carres = []
for i in range(1, 6):
carres.append(i ** 2)
# [1, 4, 9, 16, 25]
# Méthode 2 : compréhension de liste (plus avancé, très « pythonique »)
carres = [i ** 2 for i in range(1, 6)]
# [1, 4, 9, 16, 25]
# Méthode 3 : avec list() et range()
nombres = list(range(1, 11))
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
10.5. Échanger deux variables¶
a, b = 10, 20
# Méthode 1 : variable temporaire (classique, universelle)
temp = a
a = b
b = temp
# Méthode 2 : affectation multiple Python (recommandée ✅)
a, b = b, a
# Méthode 3 : arithmétique (sans variable supplémentaire, pour les curieux)
a = a + b # a = 30
b = a - b # b = 10
a = a - b # a = 20
10.6. Lire une entrée utilisateur et la valider¶
# Méthode 1 : saisie + boucle while
note = float(input("Note (0–20) : "))
while not (0 <= note <= 20):
note = float(input("Invalide. Note (0–20) : "))
# Méthode 2 : while True + break
while True:
note = float(input("Note (0–20) : "))
if 0 <= note <= 20:
break
print("Invalide, recommencez.")
# Méthode 3 : avec une fonction
def saisir_note():
while True:
note = float(input("Note (0–20) : "))
if 0 <= note <= 20:
return note
print("Invalide, recommencez.")
note = saisir_note()
11. Bonnes pratiques et conseils¶
Les 10 commandements du débutant en Python
- Nommez bien vos variables :
age_eleveplutôt quea - Indentez à 4 espaces : configurez votre éditeur
- Testez souvent : exécutez votre code après chaque petit ajout
- Lisez les messages d'erreur : ils disent exactement ce qui ne va pas
- Utilisez des
print()pour déboguer : affichez les valeurs intermédiaires - Utilisez
returndans vos fonctions (pasprint) - Convertissez les
input(): n'oubliez pasint()oufloat() - N'oubliez pas les
:aprèsif,elif,else,for,while,def - Évitez les boucles infinies : vérifiez que la condition du
whileévolue - Commentez le pourquoi, pas le quoi : le code bien nommé se lit tout seul
12. Tableau récapitulatif complet¶
| Notion | Syntaxe | Ce qu'il faut retenir |
|---|---|---|
| Variable | x = 42 |
Espace mémoire nommé qui stocke une valeur |
| Affectation | x = valeur |
Le = stocke la valeur de droite dans la variable |
| Affectation augmentée | x += 3 |
Raccourci pour x = x + 3 |
| Types | int, float, str, bool |
Entier, décimal, texte, booléen |
| Conversion | int(), float(), str() |
Change le type d'une valeur |
| Séquence | - | Les instructions s'exécutent de haut en bas |
if / elif / else |
if cond: |
Exécute un bloc selon qu'une condition est vraie ou fausse |
| Comparaison | ==, !=, <, >, <=, >= |
Renvoie True ou False |
| Logique | and, or, not |
Combine des conditions |
for |
for i in range(n): |
Boucle bornée, nombre de répétitions connu |
while |
while cond: |
Boucle non bornée, répète tant que la condition est vraie |
break |
break |
Sort immédiatement de la boucle |
continue |
continue |
Passe directement au tour suivant |
| Fonction | def nom(params): |
Bloc de code réutilisable |
return |
return valeur |
Renvoie un résultat depuis une fonction |
| Liste | [1, 2, 3] |
Collection ordonnée et modifiable de valeurs |
input() |
input("message") |
Lit une saisie (renvoie toujours un str) |
print() |
print(valeurs) |
Affiche des valeurs à l'écran |
| f-string | f"texte {var}" |
Insère des variables dans du texte |