Première nouvelle du jour : j’ai rajouté le moteur de recherche sur le site. Il était prévu de le rajouter un jour ou l’autre mais Nicolas l’ayant expressément demandé, je l’ai ajouté hier soir. D’ailleurs, vous verrez que le mot-clef que vous recherchez est “highlighté” dans l’extrait du post (whaou, trop bien).
Par la suite sachez que je vais rajouter :
- une chronologie (une simple liste de posts, mais un ordre chronologique)
- des archives (par mois sans doute)
- des pages récapitulatives (d’ailleurs, demain, je fais un récap, pour prendre un peu de recul sur ce que j’ai appris)
- des liens intéressants (blogs, doc, exemples…)
Tout ça arrive au fur et à mesure de mon apprentissage.
Throw and catch
Non il ne s’agit pas de base-ball, ni de catch, mais bel et bien d’un bloc bien utile en Ruby. Le mot catch ouvre un bloc de code (comme le fait def ou begin), il exécute le code à l’intérieur, mais si il rencontre un throw, hop! On sort du bloc (et on n’exécute pas le reste du code inclus dans le bloc.
class Eleve attr :nom def initialize(nom) @nom = nom end end moi = Eleve.new("JT") antiseches = true catch :busted do puts "Début de l'examen pour " + moi.nom + "." if antiseches==true puts moi.nom + " a été foutu dehors." throw :busted end puts "Bravo " + moi.nom + ". Diplôme reçu!" end → Début de l'examen pour JT. JT a été foutu dehors.
Je créer ma classe Eleve qui ne prend comme paramètre que le nom. Je crée l’objet “moi” qui est l’élève “JT”. Ensuite, j’établis l’objet “antiseches” à true.
Puis vient mon bloc de catch! Je l’ouvre en mettant catch suivi d’un mot-clé, en l’occurence “busted”, mais vous pouvez mettre n’importe quoi. La seule condition est que ce soit le même qui apparaisse après le throw plus loin. Puis je mets do parce que c’est un bloc de code.
Il faut faire attention à deux lignes :
- première ligne : j’affiche la phrase “Début de l’examen” avec en variable moi.nom (j’ai mis “nom” en attribut dans ma classe, donc je l’appelle comme une méthode). Et ça affiche “JT”.
- dernière ligne : j’affiche encore une phrase avec l’objet moi
Tiens, j’ai mis 2 puts. Pourtant, une seule des deux phrases est affichée à la fin. Que s’est-il passé entre-temps ?
Il y a ce bloc conditionnel. Si “antiseches” est sur true (et c’est le cas), alors j’affiche une phrase ET je sors du bloc catch parce que j’ai mis throw, suivi du même mot-clé qu’au départ :busted.
On voit alors que la phrase “Bravo ” + moi.nom + “. Diplôme reçu!” n’est pas exécutée parce qu’elle est dans le bloc catch. Et on est justement sorti de ce bloc.
Ces catch/throw permettent d’éviter l’exécution d’un code dans certains cas. On peut voir ça comme gérer une erreur. “Si y a ce problème, alors n’exécute pas ce bout de code.” C’est très pratique.
Demain, un petit récapitulatif avant le week-end. C’est surtout pour moi en fait. J’avance un peu sans me retourner et sans trop revenir sur ce que j’ai déjà vu. J’aimerais quand même m’assurer de bien comprendre les bases!
Flux RSS
Merci pour la pub, pour le moteur de recherche, et surtout pour la qualité et la régularité de tes articles.
Concernant les exceptions, une fois de plus, je trouve que Ruby fait tout pour nous simplifier la vie : le catch ne nécessite pas de try comme dans d’autres langages, et on gagne ainsi deux lignes de codes.
Humf, l’intérêt d’avoir deux blocs dans les autres langages, c’est de pouvoir mettre du code alternatif en cas de throw. C’est indispensable si tu tripote des IO par exemple.
La dans ton code, tu te contente de sortir du bloc. t’aurais pu faire exactement la même chose avec un if / else tout bête.
Je suppose qu’il existe un bidule équivalent en ruby.
Évidement l’autre avantage des try/catch c’est de “remonter” les Exceptions aux classes appelants la méthode qui fait le throw.
Nice work btw