Erreur Python : ValueError

NSI Première

Définition

Une `ValueError` (« erreur de valeur ») se produit lorsqu'une fonction reçoit un argument du bon type mais dont la valeur est inappropriée. Le cas le plus fréquent en NSI est `int()` appliqué à une chaîne qui ne représente pas un entier. Le message typique est `ValueError: invalid literal for int() with base 10: 'abc'`. Contrairement à une `TypeError`, le type est correct (c'est bien une chaîne) : c'est son contenu qui pose problème.

Exemple corrigé

Énoncé

Voici un code qui déclenche cette erreur :

```python
age = input("Quel est ton âge ? ") # l'utilisateur tape "vingt"
age = int(age)
print("Dans 10 ans tu auras", age + 10, "ans")
```

À l'exécution, si l'utilisateur saisit `vingt` (ou laisse vide), Python affiche :

```
ValueError: invalid literal for int() with base 10: 'vingt'
```

Solution

La fonction `int()` attend bien une chaîne (le type est bon), mais la valeur `'vingt'` ne contient pas de chiffres : impossible de la convertir en entier. Il faut donc vérifier la saisie avant de convertir, par exemple avec `str.isdigit()` ou un bloc `try`/`except`.

Code corrigé :

```python
saisie = input("Quel est ton âge ? ")
if saisie.isdigit():
age = int(saisie)
print("Dans 10 ans tu auras", age + 10, "ans")
else:
print("Saisie invalide : entre un nombre entier.")
```

Le bon réflexe : ne jamais faire confiance à une saisie utilisateur, valider la valeur (ou capturer l'erreur avec `try`/`except ValueError`) avant de convertir.

Erreurs classiques

  • Confondre `ValueError` et `TypeError` : `int("abc")` est une `ValueError` (type correct, valeur invalide), alors que `int([1, 2])` est une `TypeError` (mauvais type).
  • Croire que `int("3.5")` fonctionne : c'est une `ValueError`, car `int()` n'accepte pas la chaîne d'un nombre à virgule. Il faut passer par `float("3.5")`.
  • Oublier que `lst.index(x)` lève aussi une `ValueError` quand `x` n'est pas dans la liste, et pas seulement les conversions.

Toutes les notions