選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
このリポジトリはアーカイブされています。 ファイルの閲覧とクローンは可能ですが、プッシュや、課題・プルリクエストのオープンはできません。

python-10.md 5.0 KiB

5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. % Programmation avec Python (chapitre 10)
  2. % Dimitri Merejkowsky
  3. #
  4. \center \huge Exceptions
  5. # Exemple
  6. ```python
  7. def une_fonction():
  8. return 1 / 0
  9. def une_autre_fonction():
  10. une_fonction()
  11. une_autre_fonction()
  12. ```
  13. # Les backtraces
  14. ```
  15. Traceback (most recent call last):
  16. File "foo.py", line 7, in <module>
  17. une_autre_fonction()
  18. File "foo.py", line 5, in une_autre_fonction
  19. une_fonction()
  20. File "foo.py", line 2, in une_fonction
  21. return 1 / 0
  22. ZeroDivisionError: division by zero
  23. ```
  24. ZeroDivisionError est une *classe*.
  25. # Exemple modifié
  26. ```python
  27. def une_fonction(diviseur):
  28. return 1 / diviseur
  29. def une_autre_fonction():
  30. une_fonction(diviseur=0)
  31. une_autre_fonction()
  32. ```
  33. # Exemple modifié
  34. ```
  35. Traceback (most recent call last):
  36. File "foo.py", line 7, in <module>
  37. une_autre_fonction()
  38. File "foo.py", line 5, in une_autre_fonction
  39. une_fonction(diviseur=0)
  40. File "foo.py", line 2, in une_fonction
  41. return 1 / diviseur
  42. ZeroDivisionError: division by zero
  43. ```
  44. **Prenez le temps de lire les backtraces soigneusement!**
  45. # Exemples d'erreurs
  46. * `b += 2` - **NameError**
  47. * `a / 0` - **ZeroDivisionError**
  48. * `my_list[42]` - **IndexError**
  49. * ``my_dict["bad-key"]`` - **KeyError**
  50. * `1 + "two"` - **TypeError**
  51. * `open("badpath")` - **FileNotFoundError**
  52. # Hiérarchie d'exceptions (simplifiée)
  53. ```
  54. BaseException
  55. +-- SystemExit
  56. +-- KeyboardInterrupt
  57. +-- Exception
  58. +-- ArithmeticError
  59. | +-- ZeroDivisionError
  60. +-- LookupError
  61. | +-- IndexError
  62. | +-- KeyError
  63. +-- OSError
  64. | +-- FileNotFoundError
  65. +-- TypeError
  66. +-- ValueError
  67. ```
  68. Liste complète dans la documentation:
  69. https://docs.python.org/fr/3/library/exceptions.html#exception-hierarchy
  70. # KeyboardInterrupt et SystemExit
  71. * `KeyboardInterrupt` est levée quand on fait `ctrl-c`.
  72. * `SystemExit` est levé quand on utilise `sys.exit()`
  73. * Python cache la backtrace dans ce cas-là
  74. * Pas utile de l'attrapper en général
  75. # Attraper une exception
  76. ```python
  77. try:
  78. a = 1 / 0
  79. this_will_never_happen()
  80. except ZeroDivisionError:
  81. print("someone tried to divide by zero!")
  82. ```
  83. * Note: si l'exception n'est pas une fille de la classe attrapée, c'est raté.
  84. # Attraper une exception
  85. On peut mettre plusieurs blocs de `except`
  86. ```python
  87. try:
  88. something_dangerous()
  89. except ZeroDivisionError:
  90. print("tried to devide by zero")
  91. except FileNotFoundError:
  92. print("file not found")
  93. ```
  94. # Attraper une exception
  95. On peut attraper plusieurs exceptions d'un coup
  96. ```python
  97. try:
  98. something_dangerous()
  99. except (ZeroDivisionError, FileNotFoundError):
  100. print("something bad happened")
  101. ```
  102. # finally, else
  103. ```python
  104. try:
  105. something_dangerous()
  106. except SomeError:
  107. print("something bad happened")
  108. else:
  109. print("everything went well")
  110. finally:
  111. clean_up()
  112. ```
  113. # WBYL
  114. * Watch Before You Leap
  115. ```python
  116. if exists():
  117. if pas_un_dossier():
  118. if j_ai_les_droits_en_lecture():
  119. open(filename):
  120. ```
  121. # EAFP
  122. * Easier to Ask for Forgiveness than Permission
  123. ```python
  124. try:
  125. file = open(filename)
  126. except IOError:
  127. ...
  128. finally:
  129. file.close()
  130. ```
  131. # Avec with
  132. Pas besoin de `finally` :)
  133. ```python
  134. try:
  135. with open(filename) as file:
  136. lines = file.readlines()
  137. except FileNotFoundError:
  138. print("Fichier non trouvé")
  139. ```
  140. L'exception est capturée, le fichier est fermé, puis l'exception est
  141. levée à nouveau.
  142. # Attention à la position du except
  143. ```python
  144. if truc:
  145. if machin:
  146. for bidule in chose:
  147. raise MyError("kaboom!")
  148. ````
  149. # Attention à la position du except
  150. ```python
  151. if truc:
  152. if machin:
  153. try:
  154. for bidule in chose:
  155. raise MyError("kaboom!")
  156. except:
  157. ...
  158. ```
  159. # Attention à la position du except
  160. ```python
  161. if truc:
  162. try:
  163. if machin:
  164. for bidule in chose:
  165. raise MyError("kaboom!")
  166. except:
  167. ...
  168. ````
  169. # Accédér aux détails de l'exception
  170. * Avec `as`:
  171. ```python
  172. try:
  173. something_dangerous()
  174. except FileNotFoundError as error:
  175. print("file not found:", error.filename)
  176. ```
  177. \vfill
  178. Voir la documentation pour les attributs disponibles.
  179. # Lever une exception
  180. * Avec raise
  181. ```python
  182. def retirer_somme(compte, montant):
  183. solde = ...
  184. if montant >= solde:
  185. raise ValueError("montant supérieur au solde!")
  186. ```
  187. # Créer vos propres exceptions
  188. Toujours hériter de `Exception`.
  189. ```python
  190. class BankError(Exception):
  191. ....
  192. class NotEnoughMoney(BankError):
  193. def __init__(self, amount, withdrawal):
  194. self.amount = amount
  195. self.withdrawal = withdrawal
  196. ```
  197. #
  198. \center \huge Atelier
  199. # Convertisseur d'unités
  200. Miles en kilomètres, gallons en litres, etc.
  201. #
  202. \center \huge Pour la prochain fois
  203. * Rajouter le support d'autres unités (comme les volumes, ...)
  204. * Gérer toutes les erreurs possibles (unité non trouvée, ...)
  205. Plus dur:
  206. * Gérer les vitesses (mètres par secone vers miles par heure)
  207. * Gérer les températures (dégres Celsius vers Farenheit)
  208. * Gérer les monnaies