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.