% Programmation avec Python (chapitre 10) % Dimitri Merejkowsky
\center \huge Exceptions
def une_fonction():
return 1 / 0
def une_autre_fonction():
une_fonction()
une_autre_fonction()
Traceback (most recent call last):
File "foo.py", line 7, in <module>
une_autre_fonction()
File "foo.py", line 5, in une_autre_fonction
une_fonction()
File "foo.py", line 2, in une_fonction
return 1 / 0
ZeroDivisionError: division by zero
ZeroDivisionError est une classe.
def une_fonction(diviseur):
return 1 / diviseur
def une_autre_fonction():
une_fonction(diviseur=0)
une_autre_fonction()
Traceback (most recent call last):
File "foo.py", line 7, in <module>
une_autre_fonction()
File "foo.py", line 5, in une_autre_fonction
une_fonction(diviseur=0)
File "foo.py", line 2, in une_fonction
return 1 / diviseur
ZeroDivisionError: division by zero
Prenez le temps de lire les backtraces soigneusement!
b += 2
- NameErrora / 0
- ZeroDivisionErrormy_list[42]
- IndexErrormy_dict["bad-key"]
- KeyError1 + "two"
- TypeErroropen("badpath")
- FileNotFoundErrorBaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- Exception
+-- ArithmeticError
| +-- ZeroDivisionError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- OSError
| +-- FileNotFoundError
+-- TypeError
+-- ValueError
Liste complète dans la documentation: https://docs.python.org/fr/3/library/exceptions.html#exception-hierarchy
KeyboardInterrupt
est levée quand on fait ctrl-c
.
SystemExit
est levé quand on utilise sys.exit()
try:
a = 1 / 0
this_will_never_happen()
except ZeroDivisionError:
print("someone tried to divide by zero!")
On peut mettre plusieurs blocs de except
try:
something_dangerous()
except ZeroDivisionError:
print("tried to devide by zero")
except FileNotFoundError:
print("file not found")
On peut attraper plusieurs exceptions d’un coup
try:
something_dangerous()
except (ZeroDivisionError, FileNotFoundError):
print("something bad happened")
try:
something_dangerous()
except SomeError:
print("something bad happened")
else:
print("everything went well")
finally:
clean_up()
if exists():
if pas_un_dossier():
if j_ai_les_droits_en_lecture():
open(filename):
try:
file = open(filename)
except IOError:
...
finally:
file.close()
Pas besoin de finally
:)
try:
with open(filename) as file:
lines = file.readlines()
except FileNotFoundError:
print("Fichier non trouvé")
L’exception est capturée, le fichier est fermé, puis l’exception est levée à nouveau.
if truc:
if machin:
for bidule in chose:
raise MyError("kaboom!")
if truc:
if machin:
try:
for bidule in chose:
raise MyError("kaboom!")
except:
...
if truc:
try:
if machin:
for bidule in chose:
raise MyError("kaboom!")
except:
...
as
:
try:
something_dangerous()
except FileNotFoundError as error:
print("file not found:", error.filename)
\vfill
Voir la documentation pour les attributs disponibles.
def retirer_somme(compte, montant):
solde = ...
if montant >= solde:
raise ValueError("montant supérieur au solde!")
Toujours hériter de Exception
.
class BankError(Exception):
....
class NotEnoughMoney(BankError):
def __init__(self, amount, withdrawal):
self.amount = amount
self.withdrawal = withdrawal
\center \huge Atelier
Miles en kilomètres, gallons en litres, etc.