Salut. Donc pendant ce cours je vous montrer les exceptions.
Elles sont assez puissantes dans Pharo, je vais faire un survol.
Qu'est-ce qu'on peut faire avec des exceptions?
On peut les résumer, les redémarrer, signaler d'autres exceptions.
Donc je ne vais pas tout vous montrer.
Je vais vous montrer juste ce qui peut vous servir de
manière très pratique dans une première utilisation des exceptions.
Mais après, c'était important que vous sachiez qu'il n'y a pas que ça.
Et en fait il y a 2 types d'exceptions.
Il y a les erreurs, qui sont des erreurs fatales souvent,
et des notifications. Ça veut dire qu'on peut dire qu'on
n'en a pas besoin, ou que c'est juste par référence.
Donc si jamais vous êtes vraiment intéressé par lire une
référence complète sur les exceptions, il y a un chapitre
entier dans le livre qui s'appelle "Deep into Pharo", qui
sera sur le site Web du Mooc, et qui est aussi disponible
gratuitement en ligne.
Donc là, de manière pratique, qu'est-ce que vous allez apprendre?
Vous allez apprendre à lever des exceptions, à les
trapper, et puis 2, 3 méthodes dont on se sert tous les jours.
Donc en gros, s'il y a qu'une seule chose à savoir sur ce
cours, c'est écrit sur cette page, vous allez installer
un handler, ce qu'on appelle pour trapper une exception.
Vous allez signaler et puis on va avoir 2 messages sympas
qui s'appellent ensure et ifCurtailed.
Donc regardons un petit peu.
Donc imaginons que je veuille capturer une exception, c'est
le message On Do. Donc je fais un bloc.
Si j'ai une action, quand j'ai une action, si jamais j'ai
une exception, à ce moment-là je veux faire quoi?
Quelque chose. Et ici, j'ai l'exception qui est passée en argument.
Donc si on regarde sur un exemple de division par 0, si
je fais 7 divisé par 0, quand j'aurai une division par 0
qu'est-ce que je dois faire ?
Là je vais écrire attention, vous avez une division par 0.
Alors ce qu'il faut voir, là, c'est qu'une instance de la
classe exception est passée comme argument et je vais
pouvoir l'interroger, donc je vais pouvoir lui envoyer
des messages, parce que les exceptions sont des objets en Pharo.
Donc je vais envoyer des messages dans mes exceptions
pour faire quelque chose, et ça va m'afficher 0.
Donc comment on signale une exception?
En fait en gros, on crée une exception et on lui envoie le message signal.
Donc là, par exemple, quand je veux faire warning, je
vais faire warning new, je crée une exception, je la
particularise, je lui mets le bon message que je veux
dedans, et j'envoie le message signal.
Quand j'ai une exception pour pouvoir demander l'auteur
qui est en train d'écrire la méthode, vous allez avoir
une autre API parce que c'est author name request qui définit cet API.
Là je vais passer Steph et puis je vais faire signal.
Alors la plupart du temps ce qui va se passer c'est que
les classes vous proposent déjà des raccourcis pour éviter de créer.
Donc là j'envoie Out of Memory, c'est la classe, j'envoie
le message signal à la classe.
Et normalement, warning, je ne fais pas warning new
blablabla, je fais warning signal avec le texte parce que c'est plus court.
Mais ça dépendra des exceptions.
Donc, comme on aime bien la programmation
agile avec des tests unitaires et la programmation test
driven, comment est-ce que finalement on peut tester qu'une
exception est levée dans S unit?
On va utiliser should not, raise,et should raise.
Alors, lisons-le ensemble.
Donc là j'ai envie de dire, attention je ne veux pas qu'il
y ait une exception qui soit levée, qui soit une
exception subscribe out of band, si je crée une date
qui est en février.
Maintenant, si je veux tester que je dois avoir une
erreur quand je crée une date d'un mois qui serait le
13ème mois, celui-là c'est celui qu'on n'a pas en général
sur notre salaire, de toute façon là je vais utiliser should raise.
Donc là ça veut dire, attention si tu crées une date avec
un 13ème mois, je veux lever une erreur.
Donc comme ça, ça vous permet d'écrire des tests
unitaires en contrôlant les exceptions. Donc c'était une
parenthèse, mais c'est vraiment important de savoir qu'il
y a qui a ces 2 petites méthodes de support.
Donc en fait dans Pharo qu'est-ce qu'il y a comme exceptions?
Il y a les erreurs.
Donc vous avez "MessageNotUnderstood", "subscribe", "division par zéro".
Vous avez "Halt". Ça, c'est ce qu'on verra quand on va faire du debugging.
Vous pouvez mettre un break point, et ça va stopper l'exécution du système.
Vous avez les notifications, donc c'est tout ce qui n'est pas fatal.
Donc une des précautions, par exemple, vous ne devez pas
utiliser cette méthode mais vous devez en utiliser une
autre, des warnings, des time out.
Et un truc sympa, c'est que vous avez l'erreur qui décrit
les erreurs qui ne sont pas capturées.
Et c'est celle-là, qui, par exemple va lever le débuggeur.
Donc on ne s'en sert pas en général, mais c'est juste
pour vous dire que l'erreur qui n'est pas gérée c'est
aussi une classe d'erreur.
Donc les exceptions sont des vrais objets, ça veut dire
que si on regarde comment le message "does not
understand" est défini, vous pouvez aller le voir dans
proto object avec votre brower Pharo, vous allez le
faire, messageNotunderstood new j'envoie un message, je
set le receveur qui est l'objet lui-même et je fais un signal.
Donc vous obtenez cette erreur quand vous envoyez par
exemple point New, strange is bizarre, c'est un message
qui n'est pas connu Strange est bizarre donc ça va créer cette exception.
La déprécation par exemple, ça veut dire que si vous
utilisez une API qui évolue au cours du temps, et dont
Pharo a décidé qu'elle n'est plus valide, en fait comment on fait ça?
Dans Pharo on va marquer "deprecated on in", donc là par
exemple j'ai pris un exemple clair de "menu item title",
qu'est ce qu'elle dit ?
Elle dit "Utilise la méthode addfTitle au lieu de title.
Comment c'est implémenté?
C'est implémenté de la manière suivante: deprecated ça
crée une exception qui s'appelle deprecation, dans
laquelle je vais lui passer méthod explanation on in, et
qui va faire un signal.
Donc c'est juste pour vous montrer que la déprécation, le
message not understood, ce sont juste des exceptions.
On les crée, on les lève.
Donc ça c'est juste un détail.
Vous pouvez avoir des ensembles d'exceptions, ça veut
dire que vous pouvez dire si j'ai une vision par 0 et que
j'ai un warning, ou que j'ai un warning pardon, vous
allez pouvoir avec la virgule concaténer des exceptions.
Ça va vous créer une exception set, et ça vous permet de
dire "Je veux réagir à toutes ces exceptions".
Bon en général c'est très peu utilisé, donc c'est juste pour par complétude.
Donc maintenant on va regarder il y a des méthodes qui
sont vraiment pratiques, qu'on utilise souvent.
C'est finalement comment est-ce que je m'assure qu'une
expression va toujours être exécutée, même si le programme plante avant?
Donc l'idée, c'est ensure.
Donc ensure qu'est-ce que ça fait ?
ça dit, tu fais quelque chose et je te garantie que l'autre
block va être exécuté.
Donc, c'est très, très fort.
Par exemple ça permet de fermer automatiquement des fichiers.
Donc là, c'est ce qu'on voit dans spyOn par exemple, c'est
pour le profiler de Pharo il y aura un cours dessus, je
dis, je commence à faire du profiling, j'exécute le block
que je veux profiler et je me garantie que j'arrête le
profiling, même si vous m'avez passé un bloc avec une erreur.
Il y a une autre fonctionnalité d'aide qui est vraiment
sympa, c'est comment est-ce que je m'assure qu'une
expression est exécutée seulement si le programme plante.
Donc là, ce que je vais faire, je vais dire, tu fais
quelque chose, si jamais il y a quelque chose de bizarre
qui arrive je veux absolument que tu exécutes ce code.
Donc là par exemple j'ai pris un exemple sur Wade qui est
vraiment très très bas niveau, qui permet de changer le
scheduling des processeurs. Je dis voilà, là le système
schedule un sémaphore, je fais une opération.
Si jamais il y a quelque chose qui ne marche pas j'ai la
garantie par le système que je vais l'enlever de l'ordonnanceur.
Donc ces méthodes-là elles sont vraiment très pratiques
parce qu'elles sont très puissantes.
Donc là je vous ai mis un transparent pour vous expliquer
comment fonctionne le look up des méthodes, qui est en complément du livre.
Donc maintenant, c'est juste pour vous donner l'information,
ce qu'on peut faire sur les exceptions en Pharo, vous
allez pouvoir retourner une valeur alternative, vous
pouvez réessayer en fait, vous pouvez changer l'exécution
du programme et dire, mais fais comme si l'exception n'était pas arrivée.
Je peux redémarrer.
Je peux dire non non, mais finalement cette exception je
ne veux pas la traiter à ce niveau-là, je veux la traiter plus haut.
Je peux re-signaler une exception en disant, non mais
finalement tu as levé cette exception mais c'était une
vieille exception, j'en veux une nouvelle avec resignal.
Quand vous avez besoin de ça, ça veut dire que vous êtes
assez bon pour comprendre ce que vous faites, et que vous
avez lu le chapitre. Donc, sachez juste que ça existe.
Donc là c'était juste pour vous montrer quand je veux
rendre une autre valeur d'une exception, je peux faire
return, et là vous voyez que, en fait ici, j'avais mon
bloc qui me rendait cette valeur et que j'ai fait une
exception, j'ai levé une exception et que finalement c'est
cette valeur-là qui était ici, qui est rendue.
Ça c'est avec return.
Maintenant avec Resume, ce que vous allez avoir, Resume c'est,
j'ai mon exception qui est levée ici.
Et ce que je vois c'est que dans mon exception, quand je
fais resume, ce n'est pas cette valeur-là qui va être
rendue c'est la valeur suivante. Donc je lui dis,
continue après le point d'exception. Donc en fait ce que
ça veut dire Resume, ça veut dire recommence d'ici.
Et donc là ça va me rendre cette valeur-là.
Donc maintenant si on regarde ce que vous vous devez
savoir, bon dans Pharo il y a des exceptions qui sont puissantes.
OK, super. Il y a une API qui est très simple, c'est
signal pour lever l'exception, on do pour les capturer,
et vous avez Unsure qui va vous garantir que cette
expression-là est toujours exécutée, si jamais j'ai un
problème ici ou pas, et qui a cette expression-là avec
IfCurtailed, qui va exécuter On problem que si j'ai eu un
problème dans le doSomething.
Voilà. C'est tout ce que vous avez à savoir sur les
exceptions pour démarrer.