%% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %%
> [!nav]
> ↩ [[Code et Développement/Programmation/Lecture de Code - Python/Lecture de code - Python|Accueil · Lecture de code - Python]]
>
> | [[Code et Développement/Programmation/Lecture de Code - Python/12_fonctions\|← Fonctions]] | [[Code et Développement/Programmation/Lecture de Code - Python/14_modules\|Modules →]] |
> |:---|---:|
%% nav-fin %%
# Exceptions et gestion des erreurs
Une exception est une erreur qui survient à l'exécution. Sans traitement, elle arrête le programme.
---
## try / except
```python
try:
n = int(input()) # peut lever ValueError si non numérique
print(10 / n) # peut lever ZeroDivisionError
except ValueError:
print("Ce n'est pas un entier.")
except ZeroDivisionError:
print("Division par zéro impossible.")
```
Le bloc `try` est exécuté. Si une exception survient, le bloc `except` correspondant prend la main.
---
## Capturer l'exception
```python
try:
x = int("abc")
except ValueError as e:
print(f"Erreur : {e}")
# affiche Erreur : invalid literal for int() with base 10: 'abc'
```
---
## else et finally
```python
try:
n = int(input())
except ValueError:
print("Erreur de saisie.")
else:
print(f"Vous avez saisi : {n}") # exécuté s'il n'y a pas d'exception
finally:
print("Fin.") # toujours exécuté
```
---
## Exceptions courantes
| Exception | Cause typique |
|---|---|
| `ValueError` | `int("abc")`, mauvaise conversion |
| `ZeroDivisionError` | division par 0 |
| `IndexError` | `lst[10]` sur liste trop courte |
| `KeyError` | `d["clé"]` absente dans un dict |
| `TypeError` | opération sur mauvais type |
| `NameError` | variable non définie |
| `FileNotFoundError` | fichier inexistant |
---
## Lever une exception
```python
def racine(x):
if x < 0:
raise ValueError(f"x doit être positif, reçu {x}")
return x ** 0.5
```
---
## Pattern — validation de saisie
```python
while True:
try:
n = int(input("Entrez un entier : "))
break
except ValueError:
print("Valeur invalide, réessayez.")
```
## À vous
**À manipuler :** prédisez la sortie.
```sq-affiche
try:
print("A")
x = 1 / 0
print("B")
except ZeroDivisionError:
print("C")
print("D")
---
réponse: A\nC\nD
explication: l'erreur à la ligne 3 interrompt le bloc try : B n'est jamais affiché. Le programme continue après le except.
```
```sq-affiche
for v in ["4", "x", "0"]:
try:
print(8 // int(v))
except ValueError:
print("pas un entier")
except ZeroDivisionError:
print("division par zéro")
finally:
print("-")
---
réponse: 2\n-\npas un entier\n-\ndivision par zéro\n-
explication: chaque tour exécute le bloc finally, qu'une exception ait eu lieu ou non.
```
%% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %%
> [!nav]
> ↩ [[Code et Développement/Programmation/Lecture de Code - Python/Lecture de code - Python|Accueil · Lecture de code - Python]]
>
> | [[Code et Développement/Programmation/Lecture de Code - Python/12_fonctions\|← Fonctions]] | [[Code et Développement/Programmation/Lecture de Code - Python/14_modules\|Modules →]] |
> |:---|---:|
%% nav-fin %%