25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

python-10.md 4.7 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 년 전
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  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.