WEBVTT

00:00:00.640 --> 00:00:03.750 align:middle
Salut. Donc pendant ce cours
je vous montrer les exceptions.

00:00:03.950 --> 00:00:06.060 align:middle
Elles sont assez puissantes dans
Pharo, je vais faire un survol.

00:00:06.720 --> 00:00:08.000 align:middle
Qu'est-ce qu'on peut
faire avec des exceptions?

00:00:08.190 --> 00:00:11.920 align:middle
On peut les résumer, les
redémarrer, signaler d'autres exceptions.

00:00:12.120 --> 00:00:13.000 align:middle
Donc je ne vais pas
tout vous montrer.

00:00:13.160 --> 00:00:14.700 align:middle
Je vais vous montrer juste
ce qui peut vous servir de

00:00:14.900 --> 00:00:18.150 align:middle
manière très pratique dans une
première utilisation des exceptions.

00:00:18.350 --> 00:00:20.570 align:middle
Mais après, c'était important que
vous sachiez qu'il n'y a pas que ça.

00:00:21.120 --> 00:00:22.490 align:middle
Et en fait il y a 2
types d'exceptions.

00:00:22.690 --> 00:00:24.300 align:middle
Il y a les erreurs, qui sont
des erreurs fatales souvent,

00:00:24.820 --> 00:00:27.070 align:middle
et des notifications. Ça
veut dire qu'on peut dire qu'on

00:00:27.270 --> 00:00:29.030 align:middle
n'en a pas besoin, ou que
c'est juste par référence.

00:00:30.410 --> 00:00:33.410 align:middle
Donc si jamais vous êtes
vraiment intéressé par lire une

00:00:33.610 --> 00:00:37.000 align:middle
référence complète sur les
exceptions, il y a un chapitre

00:00:37.200 --> 00:00:40.020 align:middle
entier dans le livre qui
s'appelle "Deep into Pharo", qui

00:00:40.220 --> 00:00:43.400 align:middle
sera sur le site Web du
Mooc, et qui est aussi disponible

00:00:43.600 --> 00:00:44.360 align:middle
gratuitement en ligne.

00:00:45.670 --> 00:00:48.050 align:middle
Donc là, de manière pratique,
qu'est-ce que vous allez apprendre?

00:00:48.250 --> 00:00:49.830 align:middle
Vous allez apprendre à
lever des exceptions, à les

00:00:50.030 --> 00:00:54.610 align:middle
trapper, et puis 2, 3 méthodes
dont on se sert tous les jours.

00:00:55.080 --> 00:00:57.390 align:middle
Donc en gros, s'il y a
qu'une seule chose à savoir sur ce

00:00:57.590 --> 00:00:59.830 align:middle
cours, c'est écrit sur
cette page, vous allez installer

00:01:00.030 --> 00:01:02.320 align:middle
un handler, ce qu'on appelle
pour trapper une exception.

00:01:02.590 --> 00:01:06.560 align:middle
Vous allez signaler et puis
on va avoir 2 messages sympas

00:01:06.760 --> 00:01:07.590 align:middle
qui s'appellent
ensure et ifCurtailed.

00:01:09.460 --> 00:01:10.380 align:middle
Donc regardons un petit peu.

00:01:10.580 --> 00:01:15.120 align:middle
Donc imaginons que je veuille
capturer une exception, c'est

00:01:15.320 --> 00:01:18.280 align:middle
le message On Do.
Donc je fais un bloc.

00:01:18.480 --> 00:01:20.860 align:middle
Si j'ai une action, quand
j'ai une action, si jamais j'ai

00:01:21.060 --> 00:01:23.120 align:middle
une exception, à ce
moment-là je veux faire quoi?

00:01:23.380 --> 00:01:26.890 align:middle
Quelque chose. Et ici, j'ai
l'exception qui est passée en argument.

00:01:28.000 --> 00:01:32.000 align:middle
Donc si on regarde sur un
exemple de division par 0, si

00:01:32.200 --> 00:01:36.890 align:middle
je fais 7 divisé par 0,
quand j'aurai une division par 0

00:01:37.090 --> 00:01:38.440 align:middle
qu'est-ce que je dois faire ?

00:01:38.640 --> 00:01:41.740 align:middle
Là je vais écrire attention,
vous avez une division par 0.

00:01:41.940 --> 00:01:45.370 align:middle
Alors ce qu'il faut voir,
là, c'est qu'une instance de la

00:01:45.570 --> 00:01:50.510 align:middle
 classe exception est
passée comme argument et je vais

00:01:50.710 --> 00:01:52.320 align:middle
pouvoir l'interroger, donc
je vais pouvoir lui envoyer

00:01:52.520 --> 00:01:54.400 align:middle
des messages, parce que les
exceptions sont des objets en Pharo.

00:01:54.600 --> 00:01:56.770 align:middle
Donc je vais envoyer des
messages dans mes exceptions

00:01:57.000 --> 00:01:59.210 align:middle
pour faire quelque
chose, et ça va m'afficher 0.

00:02:00.910 --> 00:02:03.100 align:middle
Donc comment on
signale une exception?

00:02:03.340 --> 00:02:07.520 align:middle
En fait en gros, on crée une
exception et on lui envoie le message signal.

00:02:07.720 --> 00:02:09.860 align:middle
Donc là, par exemple,
quand je veux faire warning, je

00:02:10.060 --> 00:02:12.490 align:middle
vais faire warning new, je
crée une exception, je la

00:02:13.000 --> 00:02:15.010 align:middle
particularise, je lui mets
le bon message que je veux

00:02:15.210 --> 00:02:16.620 align:middle
dedans, et j'envoie
le message signal.

00:02:17.000 --> 00:02:20.920 align:middle
Quand j'ai une exception
pour pouvoir demander l'auteur

00:02:21.180 --> 00:02:24.320 align:middle
qui est en train d'écrire
la méthode, vous allez avoir

00:02:24.520 --> 00:02:28.070 align:middle
une autre API parce que c'est
author name request qui définit cet API.

00:02:28.340 --> 00:02:30.100 align:middle
Là je vais passer Steph et
puis je vais faire signal.

00:02:30.650 --> 00:02:32.370 align:middle
Alors la plupart du temps
ce qui va se passer c'est que

00:02:32.570 --> 00:02:37.100 align:middle
les classes vous proposent déjà
des raccourcis pour éviter de créer.

00:02:37.300 --> 00:02:40.190 align:middle
Donc là j'envoie Out of
Memory, c'est la classe, j'envoie

00:02:40.390 --> 00:02:41.620 align:middle
le message signal à la classe.

00:02:41.880 --> 00:02:44.750 align:middle
Et normalement, warning,
je ne fais pas warning new

00:02:44.950 --> 00:02:48.480 align:middle
blablabla, je fais warning signal
avec le texte parce que c'est plus court.

00:02:49.610 --> 00:02:50.420 align:middle
Mais ça dépendra des exceptions.

00:02:50.620 --> 00:02:54.750 align:middle
Donc, comme on aime
bien la programmation

00:02:55.190 --> 00:02:59.020 align:middle
agile avec des tests
unitaires et la programmation test

00:02:59.220 --> 00:03:02.190 align:middle
driven, comment est-ce que
finalement on peut tester qu'une

00:03:02.390 --> 00:03:03.880 align:middle
exception est levée dans S unit?

00:03:05.030 --> 00:03:07.950 align:middle
On va utiliser should
not, raise,et should raise.

00:03:08.150 --> 00:03:08.950 align:middle
Alors, lisons-le ensemble.

00:03:10.720 --> 00:03:14.000 align:middle
Donc là j'ai envie de dire,
attention je ne veux pas qu'il

00:03:14.200 --> 00:03:16.430 align:middle
y ait une exception qui
soit levée, qui soit une

00:03:16.630 --> 00:03:19.560 align:middle
exception subscribe out of
band, si je crée une date

00:03:21.890 --> 00:03:22.650 align:middle
qui est en février.

00:03:22.850 --> 00:03:24.340 align:middle
Maintenant, si je veux
tester que je dois avoir une

00:03:24.540 --> 00:03:28.540 align:middle
erreur quand je crée une
date d'un mois qui serait le

00:03:28.740 --> 00:03:30.580 align:middle
13ème mois, celui-là c'est
celui qu'on n'a pas en général

00:03:31.290 --> 00:03:35.120 align:middle
sur notre salaire, de toute façon
là je vais utiliser should raise.

00:03:35.820 --> 00:03:38.460 align:middle
Donc là ça veut dire,
attention si tu crées une date avec

00:03:38.660 --> 00:03:40.170 align:middle
un 13ème mois, je
veux lever une erreur.

00:03:41.250 --> 00:03:43.540 align:middle
Donc comme ça, ça vous
permet d'écrire des tests

00:03:43.740 --> 00:03:46.940 align:middle
unitaires en contrôlant les
exceptions. Donc c'était une

00:03:47.140 --> 00:03:49.350 align:middle
parenthèse, mais c'est
vraiment important de savoir qu'il

00:03:49.550 --> 00:03:51.250 align:middle
y a qui a ces 2
petites méthodes de support.

00:03:52.230 --> 00:03:54.700 align:middle
Donc en fait dans Pharo
qu'est-ce qu'il y a comme exceptions?

00:03:54.900 --> 00:03:55.660 align:middle
Il y a les erreurs.

00:03:56.310 --> 00:03:59.310 align:middle
Donc vous avez
"MessageNotUnderstood", "subscribe", "division par zéro".

00:03:59.610 --> 00:04:02.500 align:middle
Vous avez "Halt". Ça, c'est ce qu'on
verra quand on va faire du debugging.

00:04:03.570 --> 00:04:07.390 align:middle
Vous pouvez mettre un break point, et
ça va stopper l'exécution du système.

00:04:07.710 --> 00:04:10.900 align:middle
Vous avez les notifications, donc
c'est tout ce qui n'est pas fatal.

00:04:11.100 --> 00:04:13.750 align:middle
Donc une des précautions,
par exemple, vous ne devez pas

00:04:13.950 --> 00:04:15.080 align:middle
utiliser cette méthode mais
vous devez en utiliser une

00:04:15.280 --> 00:04:16.910 align:middle
autre, des warnings, des time out.

00:04:17.170 --> 00:04:20.490 align:middle
Et un truc sympa, c'est que
vous avez l'erreur qui décrit

00:04:20.690 --> 00:04:21.820 align:middle
les erreurs qui ne
sont pas capturées.

00:04:22.480 --> 00:04:24.470 align:middle
Et c'est celle-là, qui, par
exemple va lever le débuggeur.

00:04:25.510 --> 00:04:27.870 align:middle
Donc on ne s'en sert pas
en général, mais c'est juste

00:04:28.070 --> 00:04:29.840 align:middle
pour vous dire que
l'erreur qui n'est pas gérée c'est

00:04:30.040 --> 00:04:30.800 align:middle
aussi une classe d'erreur.

00:04:32.180 --> 00:04:34.260 align:middle
Donc les exceptions sont
des vrais objets, ça veut dire

00:04:34.460 --> 00:04:36.170 align:middle
que si on regarde
comment le message "does not

00:04:36.370 --> 00:04:39.540 align:middle
understand" est défini,
vous pouvez aller le voir dans

00:04:39.740 --> 00:04:42.520 align:middle
proto object avec votre
brower Pharo, vous allez le

00:04:42.720 --> 00:04:45.500 align:middle
faire, messageNotunderstood
new j'envoie un message, je

00:04:45.700 --> 00:04:48.170 align:middle
set le receveur qui est l'objet
lui-même et je fais un signal.

00:04:49.230 --> 00:04:51.250 align:middle
Donc vous obtenez cette
erreur quand vous envoyez par

00:04:51.450 --> 00:04:54.270 align:middle
exemple point New, strange
is bizarre, c'est un message

00:04:54.470 --> 00:04:57.660 align:middle
qui n'est pas connu Strange est
bizarre donc ça va créer cette exception.

00:04:59.580 --> 00:05:02.780 align:middle
La déprécation par
exemple, ça veut dire que si vous

00:05:03.000 --> 00:05:05.770 align:middle
utilisez une API qui évolue
au cours du temps, et dont

00:05:06.000 --> 00:05:10.570 align:middle
Pharo a décidé qu'elle n'est plus
valide, en fait comment on fait ça?

00:05:10.770 --> 00:05:15.430 align:middle
Dans Pharo on va marquer
"deprecated on in", donc là par

00:05:15.630 --> 00:05:18.420 align:middle
exemple j'ai pris un exemple
clair de "menu item title",

00:05:18.770 --> 00:05:19.530 align:middle
qu'est ce qu'elle dit ?

00:05:19.730 --> 00:05:22.740 align:middle
Elle dit "Utilise la méthode
addfTitle au lieu de title.

00:05:23.470 --> 00:05:27.300 align:middle
Comment c'est implémenté?

00:05:27.500 --> 00:05:31.300 align:middle
C'est implémenté de la
manière suivante: deprecated ça

00:05:32.300 --> 00:05:35.690 align:middle
crée une exception qui
s'appelle deprecation, dans

00:05:35.890 --> 00:05:40.350 align:middle
laquelle je vais lui passer
méthod explanation on in, et

00:05:40.550 --> 00:05:41.310 align:middle
qui va faire un signal.

00:05:41.510 --> 00:05:43.890 align:middle
Donc c'est juste pour vous
montrer que la déprécation, le

00:05:44.090 --> 00:05:45.850 align:middle
message not understood, ce
sont juste des exceptions.

00:05:46.050 --> 00:05:46.810 align:middle
On les crée, on les lève.

00:05:48.420 --> 00:05:49.940 align:middle
Donc ça c'est juste un détail.

00:05:50.140 --> 00:05:52.000 align:middle
Vous pouvez avoir des
ensembles d'exceptions, ça veut

00:05:52.200 --> 00:05:54.110 align:middle
dire que vous pouvez dire si
j'ai une vision par 0 et que

00:05:54.310 --> 00:05:57.000 align:middle
j'ai un warning, ou que
j'ai un warning pardon, vous

00:05:57.200 --> 00:06:01.350 align:middle
allez pouvoir avec la
virgule concaténer des exceptions.

00:06:01.550 --> 00:06:03.760 align:middle
Ça va vous créer une
exception set, et ça vous permet de

00:06:03.960 --> 00:06:06.370 align:middle
dire "Je veux réagir à
toutes ces exceptions".

00:06:06.570 --> 00:06:10.960 align:middle
Bon en général c'est très peu utilisé,
donc c'est juste pour par complétude.

00:06:11.840 --> 00:06:13.370 align:middle
Donc maintenant on va
regarder il y a des méthodes qui

00:06:13.570 --> 00:06:16.690 align:middle
sont vraiment
pratiques, qu'on utilise souvent.

00:06:17.510 --> 00:06:19.430 align:middle
C'est finalement comment
est-ce que je m'assure qu'une

00:06:19.630 --> 00:06:23.470 align:middle
expression va toujours être
exécutée, même si le programme plante avant?

00:06:24.620 --> 00:06:25.460 align:middle
Donc l'idée, c'est ensure.

00:06:25.750 --> 00:06:26.830 align:middle
Donc ensure qu'est-ce que ça fait ?

00:06:27.030 --> 00:06:31.300 align:middle
ça dit, tu fais quelque chose
et je te garantie que l'autre

00:06:31.500 --> 00:06:32.870 align:middle
block va être exécuté.

00:06:33.810 --> 00:06:34.640 align:middle
Donc, c'est très, très fort.

00:06:34.840 --> 00:06:38.550 align:middle
Par exemple ça permet de
fermer automatiquement des fichiers.

00:06:39.530 --> 00:06:41.610 align:middle
Donc là, c'est ce qu'on voit
dans spyOn par exemple, c'est

00:06:41.960 --> 00:06:45.160 align:middle
pour le profiler de Pharo
il y aura un cours dessus, je

00:06:45.360 --> 00:06:47.890 align:middle
dis, je commence à faire du
profiling, j'exécute le block

00:06:48.090 --> 00:06:51.930 align:middle
que je veux profiler et je
me garantie que j'arrête le

00:06:52.130 --> 00:06:54.660 align:middle
profiling, même si vous m'avez
passé un bloc avec une erreur.

00:06:55.510 --> 00:06:58.140 align:middle
Il y a une autre
fonctionnalité d'aide qui est vraiment

00:06:58.340 --> 00:07:00.430 align:middle
sympa, c'est comment
est-ce que je m'assure qu'une

00:07:01.200 --> 00:07:04.190 align:middle
expression est exécutée
seulement si le programme plante.

00:07:05.540 --> 00:07:07.250 align:middle
Donc là, ce que je vais
faire, je vais dire, tu fais

00:07:07.450 --> 00:07:10.540 align:middle
quelque chose, si jamais il
y a quelque chose de bizarre

00:07:10.740 --> 00:07:13.190 align:middle
qui arrive je veux
absolument que tu exécutes ce code.

00:07:14.110 --> 00:07:15.890 align:middle
Donc là par exemple j'ai
pris un exemple sur Wade qui est

00:07:16.090 --> 00:07:18.800 align:middle
vraiment très très bas
niveau, qui permet de changer le

00:07:19.000 --> 00:07:23.900 align:middle
scheduling des processeurs.
Je dis voilà, là le système

00:07:24.140 --> 00:07:27.930 align:middle
schedule un sémaphore,
je fais une opération.

00:07:28.130 --> 00:07:30.850 align:middle
Si jamais il y a quelque
chose qui ne marche pas j'ai la

00:07:31.050 --> 00:07:35.670 align:middle
garantie par le système que je
vais l'enlever de l'ordonnanceur.

00:07:36.400 --> 00:07:38.140 align:middle
Donc ces méthodes-là elles
sont vraiment très pratiques

00:07:38.340 --> 00:07:40.000 align:middle
parce qu'elles sont très puissantes.

00:07:40.540 --> 00:07:43.100 align:middle
Donc là je vous ai mis un
transparent pour vous expliquer

00:07:43.300 --> 00:07:46.720 align:middle
comment fonctionne le look up des
méthodes, qui est en complément du livre.

00:07:47.510 --> 00:07:50.310 align:middle
Donc maintenant, c'est juste
pour vous donner l'information,

00:07:50.690 --> 00:07:53.860 align:middle
ce qu'on peut faire sur
les exceptions en Pharo, vous

00:07:54.060 --> 00:07:57.000 align:middle
allez pouvoir retourner
une valeur alternative, vous

00:07:57.200 --> 00:08:00.670 align:middle
pouvez réessayer en fait,
vous pouvez changer l'exécution

00:08:00.870 --> 00:08:04.560 align:middle
du programme et dire, mais fais
comme si l'exception n'était pas arrivée.

00:08:05.520 --> 00:08:06.350 align:middle
Je peux redémarrer.

00:08:08.040 --> 00:08:10.150 align:middle
Je peux dire non non, mais
finalement cette exception je

00:08:10.350 --> 00:08:13.020 align:middle
ne veux pas la traiter à ce
niveau-là, je veux la traiter plus haut.

00:08:13.480 --> 00:08:15.490 align:middle
Je peux re-signaler une
exception en disant, non mais

00:08:15.690 --> 00:08:17.330 align:middle
finalement tu as levé cette
exception mais c'était une

00:08:17.530 --> 00:08:19.420 align:middle
vieille exception, j'en veux
une nouvelle avec resignal.

00:08:20.080 --> 00:08:22.000 align:middle
Quand vous avez besoin de
ça, ça veut dire que vous êtes

00:08:22.200 --> 00:08:24.150 align:middle
assez bon pour comprendre ce
que vous faites, et que vous

00:08:24.350 --> 00:08:28.360 align:middle
avez lu le chapitre. Donc,
sachez juste que ça existe.

00:08:28.810 --> 00:08:31.080 align:middle
Donc là c'était juste pour
vous montrer quand je veux

00:08:31.280 --> 00:08:33.080 align:middle
rendre une autre valeur
d'une exception, je peux faire

00:08:33.280 --> 00:08:37.220 align:middle
return, et là vous voyez
que, en fait ici, j'avais mon

00:08:37.420 --> 00:08:39.350 align:middle
bloc qui me rendait cette
valeur et que j'ai fait une

00:08:39.550 --> 00:08:41.820 align:middle
exception, j'ai levé une
exception et que finalement c'est

00:08:42.020 --> 00:08:43.820 align:middle
cette valeur-là qui
était ici, qui est rendue.

00:08:44.270 --> 00:08:45.030 align:middle
Ça c'est avec return.

00:08:45.690 --> 00:08:50.170 align:middle
Maintenant avec Resume, ce que
vous allez avoir, Resume c'est,

00:08:51.190 --> 00:08:53.410 align:middle
j'ai mon exception qui est levée ici.

00:08:54.540 --> 00:08:57.090 align:middle
Et ce que je vois c'est que
dans mon exception, quand je

00:08:57.290 --> 00:09:00.080 align:middle
fais resume, ce n'est pas
cette valeur-là qui va être

00:09:00.280 --> 00:09:01.860 align:middle
rendue c'est la valeur
suivante. Donc je lui dis,

00:09:02.310 --> 00:09:04.840 align:middle
continue après le point
d'exception. Donc en fait ce que

00:09:05.040 --> 00:09:06.850 align:middle
ça veut dire Resume, ça
veut dire recommence d'ici.

00:09:07.600 --> 00:09:09.660 align:middle
Et donc là ça va me
rendre cette valeur-là.

00:09:11.320 --> 00:09:13.260 align:middle
Donc maintenant si on
regarde ce que vous vous devez

00:09:13.460 --> 00:09:16.220 align:middle
savoir, bon dans Pharo il y a
des exceptions qui sont puissantes.

00:09:16.420 --> 00:09:18.720 align:middle
OK, super. Il y a une API
qui est très simple, c'est

00:09:18.920 --> 00:09:22.580 align:middle
signal pour lever
l'exception, on do pour les capturer,

00:09:23.000 --> 00:09:26.010 align:middle
et vous avez Unsure qui
va vous garantir que cette

00:09:26.210 --> 00:09:28.790 align:middle
expression-là est toujours
exécutée, si jamais j'ai un

00:09:29.000 --> 00:09:32.290 align:middle
problème ici ou pas, et qui
a cette expression-là avec

00:09:32.490 --> 00:09:34.790 align:middle
IfCurtailed, qui va exécuter
On problem que si j'ai eu un

00:09:35.000 --> 00:09:35.750 align:middle
problème dans le doSomething.

00:09:35.950 --> 00:09:37.460 align:middle
Voilà. C'est tout ce que
vous avez à savoir sur les

00:09:37.660 --> 00:09:38.420 align:middle
exceptions pour démarrer.

