1 00:00:00,640 --> 00:00:03,750 Salut. Donc pendant ce cours je vous montrer les exceptions. 2 00:00:03,950 --> 00:00:06,060 Elles sont assez puissantes dans Pharo, je vais faire un survol. 3 00:00:06,720 --> 00:00:08,000 Qu'est-ce qu'on peut faire avec des exceptions? 4 00:00:08,190 --> 00:00:11,920 On peut les résumer, les redémarrer, signaler d'autres exceptions. 5 00:00:12,120 --> 00:00:13,000 Donc je ne vais pas tout vous montrer. 6 00:00:13,160 --> 00:00:14,700 Je vais vous montrer juste ce qui peut vous servir de 7 00:00:14,900 --> 00:00:18,150 manière très pratique dans une première utilisation des exceptions. 8 00:00:18,350 --> 00:00:20,570 Mais après, c'était important que vous sachiez qu'il n'y a pas que ça. 9 00:00:21,120 --> 00:00:22,490 Et en fait il y a 2 types d'exceptions. 10 00:00:22,690 --> 00:00:24,300 Il y a les erreurs, qui sont des erreurs fatales souvent, 11 00:00:24,820 --> 00:00:27,070 et des notifications. Ça veut dire qu'on peut dire qu'on 12 00:00:27,270 --> 00:00:29,030 n'en a pas besoin, ou que c'est juste par référence. 13 00:00:30,410 --> 00:00:33,410 Donc si jamais vous êtes vraiment intéressé par lire une 14 00:00:33,610 --> 00:00:37,000 référence complète sur les exceptions, il y a un chapitre 15 00:00:37,200 --> 00:00:40,020 entier dans le livre qui s'appelle "Deep into Pharo", qui 16 00:00:40,220 --> 00:00:43,400 sera sur le site Web du Mooc, et qui est aussi disponible 17 00:00:43,600 --> 00:00:44,360 gratuitement en ligne. 18 00:00:45,670 --> 00:00:48,050 Donc là, de manière pratique, qu'est-ce que vous allez apprendre? 19 00:00:48,250 --> 00:00:49,830 Vous allez apprendre à lever des exceptions, à les 20 00:00:50,030 --> 00:00:54,610 trapper, et puis 2, 3 méthodes dont on se sert tous les jours. 21 00:00:55,080 --> 00:00:57,390 Donc en gros, s'il y a qu'une seule chose à savoir sur ce 22 00:00:57,590 --> 00:00:59,830 cours, c'est écrit sur cette page, vous allez installer 23 00:01:00,030 --> 00:01:02,320 un handler, ce qu'on appelle pour trapper une exception. 24 00:01:02,590 --> 00:01:06,560 Vous allez signaler et puis on va avoir 2 messages sympas 25 00:01:06,760 --> 00:01:07,590 qui s'appellent ensure et ifCurtailed. 26 00:01:09,460 --> 00:01:10,380 Donc regardons un petit peu. 27 00:01:10,580 --> 00:01:15,120 Donc imaginons que je veuille capturer une exception, c'est 28 00:01:15,320 --> 00:01:18,280 le message On Do. Donc je fais un bloc. 29 00:01:18,480 --> 00:01:20,860 Si j'ai une action, quand j'ai une action, si jamais j'ai 30 00:01:21,060 --> 00:01:23,120 une exception, à ce moment-là je veux faire quoi? 31 00:01:23,380 --> 00:01:26,890 Quelque chose. Et ici, j'ai l'exception qui est passée en argument. 32 00:01:28,000 --> 00:01:32,000 Donc si on regarde sur un exemple de division par 0, si 33 00:01:32,200 --> 00:01:36,890 je fais 7 divisé par 0, quand j'aurai une division par 0 34 00:01:37,090 --> 00:01:38,440 qu'est-ce que je dois faire ? 35 00:01:38,640 --> 00:01:41,740 Là je vais écrire attention, vous avez une division par 0. 36 00:01:41,940 --> 00:01:45,370 Alors ce qu'il faut voir, là, c'est qu'une instance de la 37 00:01:45,570 --> 00:01:50,510 classe exception est passée comme argument et je vais 38 00:01:50,710 --> 00:01:52,320 pouvoir l'interroger, donc je vais pouvoir lui envoyer 39 00:01:52,520 --> 00:01:54,400 des messages, parce que les exceptions sont des objets en Pharo. 40 00:01:54,600 --> 00:01:56,770 Donc je vais envoyer des messages dans mes exceptions 41 00:01:57,000 --> 00:01:59,210 pour faire quelque chose, et ça va m'afficher 0. 42 00:02:00,910 --> 00:02:03,100 Donc comment on signale une exception? 43 00:02:03,340 --> 00:02:07,520 En fait en gros, on crée une exception et on lui envoie le message signal. 44 00:02:07,720 --> 00:02:09,860 Donc là, par exemple, quand je veux faire warning, je 45 00:02:10,060 --> 00:02:12,490 vais faire warning new, je crée une exception, je la 46 00:02:13,000 --> 00:02:15,010 particularise, je lui mets le bon message que je veux 47 00:02:15,210 --> 00:02:16,620 dedans, et j'envoie le message signal. 48 00:02:17,000 --> 00:02:20,920 Quand j'ai une exception pour pouvoir demander l'auteur 49 00:02:21,180 --> 00:02:24,320 qui est en train d'écrire la méthode, vous allez avoir 50 00:02:24,520 --> 00:02:28,070 une autre API parce que c'est author name request qui définit cet API. 51 00:02:28,340 --> 00:02:30,100 Là je vais passer Steph et puis je vais faire signal. 52 00:02:30,650 --> 00:02:32,370 Alors la plupart du temps ce qui va se passer c'est que 53 00:02:32,570 --> 00:02:37,100 les classes vous proposent déjà des raccourcis pour éviter de créer. 54 00:02:37,300 --> 00:02:40,190 Donc là j'envoie Out of Memory, c'est la classe, j'envoie 55 00:02:40,390 --> 00:02:41,620 le message signal à la classe. 56 00:02:41,880 --> 00:02:44,750 Et normalement, warning, je ne fais pas warning new 57 00:02:44,950 --> 00:02:48,480 blablabla, je fais warning signal avec le texte parce que c'est plus court. 58 00:02:49,610 --> 00:02:50,420 Mais ça dépendra des exceptions. 59 00:02:50,620 --> 00:02:54,750 Donc, comme on aime bien la programmation 60 00:02:55,190 --> 00:02:59,020 agile avec des tests unitaires et la programmation test 61 00:02:59,220 --> 00:03:02,190 driven, comment est-ce que finalement on peut tester qu'une 62 00:03:02,390 --> 00:03:03,880 exception est levée dans S unit? 63 00:03:05,030 --> 00:03:07,950 On va utiliser should not, raise,et should raise. 64 00:03:08,150 --> 00:03:08,950 Alors, lisons-le ensemble. 65 00:03:10,720 --> 00:03:14,000 Donc là j'ai envie de dire, attention je ne veux pas qu'il 66 00:03:14,200 --> 00:03:16,430 y ait une exception qui soit levée, qui soit une 67 00:03:16,630 --> 00:03:19,560 exception subscribe out of band, si je crée une date 68 00:03:21,890 --> 00:03:22,650 qui est en février. 69 00:03:22,850 --> 00:03:24,340 Maintenant, si je veux tester que je dois avoir une 70 00:03:24,540 --> 00:03:28,540 erreur quand je crée une date d'un mois qui serait le 71 00:03:28,740 --> 00:03:30,580 13ème mois, celui-là c'est celui qu'on n'a pas en général 72 00:03:31,290 --> 00:03:35,120 sur notre salaire, de toute façon là je vais utiliser should raise. 73 00:03:35,820 --> 00:03:38,460 Donc là ça veut dire, attention si tu crées une date avec 74 00:03:38,660 --> 00:03:40,170 un 13ème mois, je veux lever une erreur. 75 00:03:41,250 --> 00:03:43,540 Donc comme ça, ça vous permet d'écrire des tests 76 00:03:43,740 --> 00:03:46,940 unitaires en contrôlant les exceptions. Donc c'était une 77 00:03:47,140 --> 00:03:49,350 parenthèse, mais c'est vraiment important de savoir qu'il 78 00:03:49,550 --> 00:03:51,250 y a qui a ces 2 petites méthodes de support. 79 00:03:52,230 --> 00:03:54,700 Donc en fait dans Pharo qu'est-ce qu'il y a comme exceptions? 80 00:03:54,900 --> 00:03:55,660 Il y a les erreurs. 81 00:03:56,310 --> 00:03:59,310 Donc vous avez "MessageNotUnderstood", "subscribe", "division par zéro". 82 00:03:59,610 --> 00:04:02,500 Vous avez "Halt". Ça, c'est ce qu'on verra quand on va faire du debugging. 83 00:04:03,570 --> 00:04:07,390 Vous pouvez mettre un break point, et ça va stopper l'exécution du système. 84 00:04:07,710 --> 00:04:10,900 Vous avez les notifications, donc c'est tout ce qui n'est pas fatal. 85 00:04:11,100 --> 00:04:13,750 Donc une des précautions, par exemple, vous ne devez pas 86 00:04:13,950 --> 00:04:15,080 utiliser cette méthode mais vous devez en utiliser une 87 00:04:15,280 --> 00:04:16,910 autre, des warnings, des time out. 88 00:04:17,170 --> 00:04:20,490 Et un truc sympa, c'est que vous avez l'erreur qui décrit 89 00:04:20,690 --> 00:04:21,820 les erreurs qui ne sont pas capturées. 90 00:04:22,480 --> 00:04:24,470 Et c'est celle-là, qui, par exemple va lever le débuggeur. 91 00:04:25,510 --> 00:04:27,870 Donc on ne s'en sert pas en général, mais c'est juste 92 00:04:28,070 --> 00:04:29,840 pour vous dire que l'erreur qui n'est pas gérée c'est 93 00:04:30,040 --> 00:04:30,800 aussi une classe d'erreur. 94 00:04:32,180 --> 00:04:34,260 Donc les exceptions sont des vrais objets, ça veut dire 95 00:04:34,460 --> 00:04:36,170 que si on regarde comment le message "does not 96 00:04:36,370 --> 00:04:39,540 understand" est défini, vous pouvez aller le voir dans 97 00:04:39,740 --> 00:04:42,520 proto object avec votre brower Pharo, vous allez le 98 00:04:42,720 --> 00:04:45,500 faire, messageNotunderstood new j'envoie un message, je 99 00:04:45,700 --> 00:04:48,170 set le receveur qui est l'objet lui-même et je fais un signal. 100 00:04:49,230 --> 00:04:51,250 Donc vous obtenez cette erreur quand vous envoyez par 101 00:04:51,450 --> 00:04:54,270 exemple point New, strange is bizarre, c'est un message 102 00:04:54,470 --> 00:04:57,660 qui n'est pas connu Strange est bizarre donc ça va créer cette exception. 103 00:04:59,580 --> 00:05:02,780 La déprécation par exemple, ça veut dire que si vous 104 00:05:03,000 --> 00:05:05,770 utilisez une API qui évolue au cours du temps, et dont 105 00:05:06,000 --> 00:05:10,570 Pharo a décidé qu'elle n'est plus valide, en fait comment on fait ça? 106 00:05:10,770 --> 00:05:15,430 Dans Pharo on va marquer "deprecated on in", donc là par 107 00:05:15,630 --> 00:05:18,420 exemple j'ai pris un exemple clair de "menu item title", 108 00:05:18,770 --> 00:05:19,530 qu'est ce qu'elle dit ? 109 00:05:19,730 --> 00:05:22,740 Elle dit "Utilise la méthode addfTitle au lieu de title. 110 00:05:23,470 --> 00:05:27,300 Comment c'est implémenté? 111 00:05:27,500 --> 00:05:31,300 C'est implémenté de la manière suivante: deprecated ça 112 00:05:32,300 --> 00:05:35,690 crée une exception qui s'appelle deprecation, dans 113 00:05:35,890 --> 00:05:40,350 laquelle je vais lui passer méthod explanation on in, et 114 00:05:40,550 --> 00:05:41,310 qui va faire un signal. 115 00:05:41,510 --> 00:05:43,890 Donc c'est juste pour vous montrer que la déprécation, le 116 00:05:44,090 --> 00:05:45,850 message not understood, ce sont juste des exceptions. 117 00:05:46,050 --> 00:05:46,810 On les crée, on les lève. 118 00:05:48,420 --> 00:05:49,940 Donc ça c'est juste un détail. 119 00:05:50,140 --> 00:05:52,000 Vous pouvez avoir des ensembles d'exceptions, ça veut 120 00:05:52,200 --> 00:05:54,110 dire que vous pouvez dire si j'ai une vision par 0 et que 121 00:05:54,310 --> 00:05:57,000 j'ai un warning, ou que j'ai un warning pardon, vous 122 00:05:57,200 --> 00:06:01,350 allez pouvoir avec la virgule concaténer des exceptions. 123 00:06:01,550 --> 00:06:03,760 Ça va vous créer une exception set, et ça vous permet de 124 00:06:03,960 --> 00:06:06,370 dire "Je veux réagir à toutes ces exceptions". 125 00:06:06,570 --> 00:06:10,960 Bon en général c'est très peu utilisé, donc c'est juste pour par complétude. 126 00:06:11,840 --> 00:06:13,370 Donc maintenant on va regarder il y a des méthodes qui 127 00:06:13,570 --> 00:06:16,690 sont vraiment pratiques, qu'on utilise souvent. 128 00:06:17,510 --> 00:06:19,430 C'est finalement comment est-ce que je m'assure qu'une 129 00:06:19,630 --> 00:06:23,470 expression va toujours être exécutée, même si le programme plante avant? 130 00:06:24,620 --> 00:06:25,460 Donc l'idée, c'est ensure. 131 00:06:25,750 --> 00:06:26,830 Donc ensure qu'est-ce que ça fait ? 132 00:06:27,030 --> 00:06:31,300 ça dit, tu fais quelque chose et je te garantie que l'autre 133 00:06:31,500 --> 00:06:32,870 block va être exécuté. 134 00:06:33,810 --> 00:06:34,640 Donc, c'est très, très fort. 135 00:06:34,840 --> 00:06:38,550 Par exemple ça permet de fermer automatiquement des fichiers. 136 00:06:39,530 --> 00:06:41,610 Donc là, c'est ce qu'on voit dans spyOn par exemple, c'est 137 00:06:41,960 --> 00:06:45,160 pour le profiler de Pharo il y aura un cours dessus, je 138 00:06:45,360 --> 00:06:47,890 dis, je commence à faire du profiling, j'exécute le block 139 00:06:48,090 --> 00:06:51,930 que je veux profiler et je me garantie que j'arrête le 140 00:06:52,130 --> 00:06:54,660 profiling, même si vous m'avez passé un bloc avec une erreur. 141 00:06:55,510 --> 00:06:58,140 Il y a une autre fonctionnalité d'aide qui est vraiment 142 00:06:58,340 --> 00:07:00,430 sympa, c'est comment est-ce que je m'assure qu'une 143 00:07:01,200 --> 00:07:04,190 expression est exécutée seulement si le programme plante. 144 00:07:05,540 --> 00:07:07,250 Donc là, ce que je vais faire, je vais dire, tu fais 145 00:07:07,450 --> 00:07:10,540 quelque chose, si jamais il y a quelque chose de bizarre 146 00:07:10,740 --> 00:07:13,190 qui arrive je veux absolument que tu exécutes ce code. 147 00:07:14,110 --> 00:07:15,890 Donc là par exemple j'ai pris un exemple sur Wade qui est 148 00:07:16,090 --> 00:07:18,800 vraiment très très bas niveau, qui permet de changer le 149 00:07:19,000 --> 00:07:23,900 scheduling des processeurs. Je dis voilà, là le système 150 00:07:24,140 --> 00:07:27,930 schedule un sémaphore, je fais une opération. 151 00:07:28,130 --> 00:07:30,850 Si jamais il y a quelque chose qui ne marche pas j'ai la 152 00:07:31,050 --> 00:07:35,670 garantie par le système que je vais l'enlever de l'ordonnanceur. 153 00:07:36,400 --> 00:07:38,140 Donc ces méthodes-là elles sont vraiment très pratiques 154 00:07:38,340 --> 00:07:40,000 parce qu'elles sont très puissantes. 155 00:07:40,540 --> 00:07:43,100 Donc là je vous ai mis un transparent pour vous expliquer 156 00:07:43,300 --> 00:07:46,720 comment fonctionne le look up des méthodes, qui est en complément du livre. 157 00:07:47,510 --> 00:07:50,310 Donc maintenant, c'est juste pour vous donner l'information, 158 00:07:50,690 --> 00:07:53,860 ce qu'on peut faire sur les exceptions en Pharo, vous 159 00:07:54,060 --> 00:07:57,000 allez pouvoir retourner une valeur alternative, vous 160 00:07:57,200 --> 00:08:00,670 pouvez réessayer en fait, vous pouvez changer l'exécution 161 00:08:00,870 --> 00:08:04,560 du programme et dire, mais fais comme si l'exception n'était pas arrivée. 162 00:08:05,520 --> 00:08:06,350 Je peux redémarrer. 163 00:08:08,040 --> 00:08:10,150 Je peux dire non non, mais finalement cette exception je 164 00:08:10,350 --> 00:08:13,020 ne veux pas la traiter à ce niveau-là, je veux la traiter plus haut. 165 00:08:13,480 --> 00:08:15,490 Je peux re-signaler une exception en disant, non mais 166 00:08:15,690 --> 00:08:17,330 finalement tu as levé cette exception mais c'était une 167 00:08:17,530 --> 00:08:19,420 vieille exception, j'en veux une nouvelle avec resignal. 168 00:08:20,080 --> 00:08:22,000 Quand vous avez besoin de ça, ça veut dire que vous êtes 169 00:08:22,200 --> 00:08:24,150 assez bon pour comprendre ce que vous faites, et que vous 170 00:08:24,350 --> 00:08:28,360 avez lu le chapitre. Donc, sachez juste que ça existe. 171 00:08:28,810 --> 00:08:31,080 Donc là c'était juste pour vous montrer quand je veux 172 00:08:31,280 --> 00:08:33,080 rendre une autre valeur d'une exception, je peux faire 173 00:08:33,280 --> 00:08:37,220 return, et là vous voyez que, en fait ici, j'avais mon 174 00:08:37,420 --> 00:08:39,350 bloc qui me rendait cette valeur et que j'ai fait une 175 00:08:39,550 --> 00:08:41,820 exception, j'ai levé une exception et que finalement c'est 176 00:08:42,020 --> 00:08:43,820 cette valeur-là qui était ici, qui est rendue. 177 00:08:44,270 --> 00:08:45,030 Ça c'est avec return. 178 00:08:45,690 --> 00:08:50,170 Maintenant avec Resume, ce que vous allez avoir, Resume c'est, 179 00:08:51,190 --> 00:08:53,410 j'ai mon exception qui est levée ici. 180 00:08:54,540 --> 00:08:57,090 Et ce que je vois c'est que dans mon exception, quand je 181 00:08:57,290 --> 00:09:00,080 fais resume, ce n'est pas cette valeur-là qui va être 182 00:09:00,280 --> 00:09:01,860 rendue c'est la valeur suivante. Donc je lui dis, 183 00:09:02,310 --> 00:09:04,840 continue après le point d'exception. Donc en fait ce que 184 00:09:05,040 --> 00:09:06,850 ça veut dire Resume, ça veut dire recommence d'ici. 185 00:09:07,600 --> 00:09:09,660 Et donc là ça va me rendre cette valeur-là. 186 00:09:11,320 --> 00:09:13,260 Donc maintenant si on regarde ce que vous vous devez 187 00:09:13,460 --> 00:09:16,220 savoir, bon dans Pharo il y a des exceptions qui sont puissantes. 188 00:09:16,420 --> 00:09:18,720 OK, super. Il y a une API qui est très simple, c'est 189 00:09:18,920 --> 00:09:22,580 signal pour lever l'exception, on do pour les capturer, 190 00:09:23,000 --> 00:09:26,010 et vous avez Unsure qui va vous garantir que cette 191 00:09:26,210 --> 00:09:28,790 expression-là est toujours exécutée, si jamais j'ai un 192 00:09:29,000 --> 00:09:32,290 problème ici ou pas, et qui a cette expression-là avec 193 00:09:32,490 --> 00:09:34,790 IfCurtailed, qui va exécuter On problem que si j'ai eu un 194 00:09:35,000 --> 00:09:35,750 problème dans le doSomething. 195 00:09:35,950 --> 00:09:37,460 Voilà. C'est tout ce que vous avez à savoir sur les 196 00:09:37,660 --> 00:09:38,420 exceptions pour démarrer.