Aller au contenu

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 :

  1. l'erreur s'est produite (numéro de ligne)
  2. Quel type d'erreur c'est
  3. 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

  1. Nommez bien vos variables : age_eleve plutôt que a
  2. Indentez à 4 espaces : configurez votre éditeur
  3. Testez souvent : exécutez votre code après chaque petit ajout
  4. Lisez les messages d'erreur : ils disent exactement ce qui ne va pas
  5. Utilisez des print() pour déboguer : affichez les valeurs intermédiaires
  6. Utilisez return dans vos fonctions (pas print)
  7. Convertissez les input() : n'oubliez pas int() ou float()
  8. N'oubliez pas les : après if, elif, else, for, while, def
  9. Évitez les boucles infinies : vérifiez que la condition du while évolue
  10. 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