Section 8.1

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/catch et 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 le catch. Une erreur porte ce qu’on veut y mettre.