14.5 Lever des exceptions
Objectifs d'apprentissage
À la fin de cette section, vous devriez être capable de
- Utiliser une instruction
raisepour indiquer qu'une entrée utilisateur est invalide. - Expliquer le flux d'exécution lorsqu'une exception est levée.
L'instruction raise
Un programme peut lever une exception lorsqu'une erreur est détectée. Lever une exception oblige un programme à traiter l'erreur. Si l'exception n'est pas gérée à l'aide de try et except, le programme affiche un message d'erreur et se termine.
Exemple 14.6
Taille de pizza invalide
La classe suivante représente une pizza mise en vente. Le dictionnaire SIZES associe une abréviation au nom d'une taille et à son prix. La ligne 11 vérifie si la taille reçue par le constructeur se trouve dans le dictionnaire. La ligne 12 lève une exception ValueError avec un message d'erreur spécifique.
1 | class Pizza: |
2 | |
3 | SIZES = { |
4 | "S": ("Small", 5.99), |
5 | "M": ("Medium", 7.99), |
6 | "L": ("Large", 9.99), |
7 | "XL": ("X-Large", 11.99), |
8 | } |
9 | |
10 | def __init__(self, size): |
11 | if size not in Pizza.SIZES: |
12 | raise ValueError(f"Unknown size '{size}'") |
13 | self.size = size |
14 | |
15 | def __str__(self): |
16 | name, price = Pizza.SIZES[self.size] |
17 | return f"{name} pizza for ${price}" |
18 | |
19 | if __name__ == "__main__": |
20 | p1 = Pizza("L") |
21 | print(p1) |
22 | p2 = Pizza("Z") |
23 | print(p2) |
Large pizza for $9.99
Traceback (most recent call last):
File "pizza.py", line 23, in <module>
p2 = Pizza("Z")
File "pizza.py", line 12, in __init__
raise ValueError(f"Unknown size '{size}'")
ValueError: Unknown size 'Z'
Lever une exception dans un constructeur empêche la construction d'un objet invalide. Dans cet exemple, p1 est construit, mais p2 ne l'est pas.
Concepts en pratique
Prédire la sortie avec raise
Pour chaque extrait de code, quelle est la sortie ?
À vous d'essayer
Objets linguistiques
Le fichier top27.csv est basé sur la liste des langues par nombre de locuteurs natifs de Wikipédia. Un linguiste souhaite manipuler ces données de manière orientée objet et a déjà défini une classe Language. Cependant, le code ne fonctionne pas correctement en raison d'erreurs dans le fichier CSV. (Le programme CSV ne peut pas être modifié, car son but est précisément de détecter ce genre d'erreurs.)
Votre tâche consiste à modifier le constructeur pour lever une exception ValueError dans les situations suivantes :
- Si la ligne ne comporte pas exactement quatre valeurs (séparées par des virgules).
- Si le nombre de locuteurs n'est pas un nombre à virgule flottante positif.
Remarque : Le fichier top27.csv fourni comprend des erreurs pour l'anglais, le coréen et le français. Votre programme doit lever une exception ValueError uniquement pour ces langues. Aucune autre erreur (y compris IndexError) ne doit être levée.
À vous d'essayer
Recherche de clés
Lors de la recherche d'une valeur dans un dictionnaire, une clé doit correspondre exactement. Ex. : Étant donné fruit = {"apple": 1, "banana": 2}, l'expression fruit["Apple"] lève une exception KeyError car "Apple" n'est pas identique à "apple". De même, fruit["NANA"] lève une exception KeyError car "nana" ne correspond pas exactement à "banana".
Implémentez la fonction lookup(). Cette fonction tente de trouver une clé dans le dictionnaire qui correspond au terme recherché. Une clé correspond si le terme recherché est une sous-chaîne de la clé, sans tenir compte de la casse. Ex. : La clé "banana" correspond au terme recherché "NANA".
Si aucune clé correspondante n'est trouvée, lookup() doit lever une exception KeyError avec le message "search term not found". Si plusieurs correspondances sont trouvées, lookup() doit lever une exception KeyError avec le message "multiple keys found". Sinon, lookup() doit renvoyer à la fois la clé et la valeur correspondant à l'élément du dictionnaire.
Avec le fichier books.csv, la sortie doit être :
Found: ('Pride and Prejudice', 9780141439518)
Found: ('The Hobbit', 9780547928227)
Error: search term not found
Error: multiple keys found