Lancer et attraper
throw lance une instance d'archetype, catch l'attrape par son type exact.
Une erreur, en Archon, est un exemplaire d’archetype — la section 7 vient de vous donner tout ce qu’il faut pour la comprendre.
archetype PotionRatee {
message: str;
}
archetype Alambic {
distiller(dose: int) -> int {
if (dose > 3) {
throw PotionRatee(message: "trop de mandragore");
}
return dose * 2;
}
}
@entry(demarrer)
object MonProgramme {
demarrer() {
var alambic := Alambic();
try {
Console.print(text: $"essence : {alambic.distiller(dose: 2)}");
Console.print(text: $"essence : {alambic.distiller(dose: 5)}");
Console.print(text: "jamais atteint");
} catch (erreur: PotionRatee) {
Console.print(text: $"raté : {erreur.message}");
}
Console.print(text: "le programme continue");
}
}
throw lance une instance
throw PotionRatee(message: "trop de mandragore");
PotionRatee est un archetype ordinaire — un champ message, rien de spécial, pas même une
convention de nom imposée. throw en lance un exemplaire, construit comme n’importe quel
autre. Jamais une valeur nue : une erreur porte de quoi se raconter, et c’est un archetype qui
sait porter des champs.
Et rappelez-vous la 5.2 : throw termine la méthode aussi bien que return. Une méthode
qui lève ne rend rien — elle a répondu autrement.
L’erreur remonte jusqu’au catch
distiller(dose: 5) lève au fond de l’alambic ; le catch est dans demarrer. Entre les
deux, l’erreur remonte : elle quitte distiller, saute la ligne « jamais atteint », et
cherche le premier catch qui lui correspond. Non attrapée, elle serait remontée jusqu’au
point d’entrée et aurait arrêté le programme — c’est ce que la 6.1 vous a montré.
} catch (erreur: PotionRatee) {
Console.print(text: $"raté : {erreur.message}");
}
Le catch nomme un type et reçoit l’exemplaire lancé : erreur.message lit son champ, comme
n’importe quel champ de la section 7.
La correspondance est exacte
catch (erreur: PotionRatee) n’attrape que ce qui a été lancé comme PotionRatee — jamais
un autre archetype qui aurait par coïncidence les mêmes champs. C’est un écart délibéré avec le
reste du langage : ici, c’est l’identité du type qui compte, pas sa forme.
À vous
- Passez la première dose à 4 : la ligne « essence » disparaît, le raté arrive dès le premier appel.
- Retirez le
try/catchet laissez la dose à 5 : l’erreur remonte tout en haut, le programme s’arrête — « le programme continue » ne s’affiche plus. - Donnez un second champ à
PotionRatee—dose: int— lancez-le rempli, et affichez-le dans lecatch. Une erreur porte ce qu’on veut y mettre.