>VerseTrainer
← Parcours Apprendre

3. Le contrôle par échec

Objectifs du module

  • Comprendre la notion d'échec Verse : une expression peut échouer à produire une valeur plutôt que renvoyer faux
  • Utiliser if/else avec des indexations de tableaux/maps et des conditions à plusieurs clauses (virgules = ET)
  • Combiner des conditions avec and, or, not, et enchaîner plusieurs branches en imbriquant if dans else

Le contrôle par échec

Ce module est le plus important du parcours. Si tu viens de Blueprint, C++ ou C# et que tu n'as jamais programmé en Verse, c'est ici que ton intuition va le plus te trahir : Verse ne pense pas en booléens true/false pour son contrôle de flux, mais en échec. Une expression ne renvoie pas juste « faux » — elle peut littéralement échouer à produire une valeur du tout. Prends le temps de bien lire ce module, il conditionne tout ce qui suit.

Une expression peut échouer

Tu as déjà croisé l'indexation d'un tableau ou d'une map dans les problèmes de la banque libre. Regarde :

verse
if (Item := Items[Index]):
    Item
else:
    "empty"

Items[Index] n'est pas une expression qui renvoie toujours une valeur, suivie d'un test à part — si Index est hors bornes, l'expression échoue directement, sans lever d'exception classique. Le if capte cet échec automatiquement : la branche then ne s'exécute que si Items[Index] a réussi à produire une valeur (liée ici au nom Item), sinon on passe directement à else. C'est la même mécanique pour une map : Catalog[Name] échoue si Name n'est pas une clé du catalogue.

Plusieurs conditions, séparées par des virgules

Une condition de if peut contenir plusieurs clauses séparées par des virgules — elles doivent toutes réussir pour que la branche then s'exécute, exactement comme un « et » logique :

verse
if (SpellCount := Spellbook["Spell"], SpellCount >= 1, Mana >= RequiredMana):
    true
else:
    false

Si la clé "Spell" est absente, la première clause échoue déjà et on passe à else.

Astuce

Plusieurs clauses séparées par des virgules dans un if se comportent comme un and : elles doivent toutes réussir pour entrer dans le then. Dès qu'une clause échoue, les suivantes ne sont même pas évaluées.

L'opérateur ?

? déclenche manuellement un contrôle d'échec sur une seule expression : appliqué à une valeur logic, il échoue si elle vaut false ; appliqué à un option, il échoue si l'option est vide (et renvoie la valeur contenue si elle est pleine) — tu pratiqueras cet usage en détail avec le type option au module 5.

Quand l'utiliser

Utilise ? quand tu veux qu'un échec remonte directement, sans écrire de if/else — typiquement pour enchaîner plusieurs vérifications rapides à l'intérieur d'une fonction qui peut elle-même échouer. Dès que tu as besoin d'un chemin alternatif explicite (afficher un message, retomber sur une valeur par défaut), repasse par if/else.

Piège

? se colle à l'expression immédiatement à sa gauche, pas à toute la condition qui précède. X > 0? ne fait donc pas ce qu'on croit : le ? s'applique seulement à 0, pas à X > 0. Pour contrôler l'échec d'une comparaison entière, il faut la parenthéser explicitement : (X > 0)?.

and, or, not

Ces trois mots-clés combinent des conditions d'échec, comme dans la plupart des langages :

verse
(Supplies >= RequiredSupplies and Stamina >= RequiredStamina) or HasSpecialPass

not inverse une condition : HP > 0 and not IsStunned n'est vrai que si HP est positif ET que le personnage n'est pas étourdi.

Quand l'utiliser

Combine tes conditions avec and/or/not quand elles portent sur une seule et même décision (plusieurs jauges à vérifier ensemble, par exemple). Dès que chaque échec doit mener à un message ou un comportement différent, préfère des if imbriqués : and/or ne disent pas quelle clause a échoué.

Enchaîner plusieurs branches

À retenir

Verse n'a pas de mot-clé elif dédié : pour enchaîner plusieurs branches, on imbrique un if dans le else du précédent.

Verse n'a pas de mot-clé elif dédié : pour enchaîner plusieurs branches, on imbrique un if dans le else du précédent :

verse
if (HP > 100):
    "high"
else:
    if (HP > 30):
        "medium"
    else:
        "low"

Ce que tu vas pratiquer

Les exercices de ce module sont plus nombreux que dans les autres — c'est volontaire, ce concept mérite d'être pratiqué sous plusieurs angles avant de passer aux boucles. Tu manipuleras l'échec via l'indexation de tableaux et de maps, les conditions à plusieurs clauses, les combinateurs and/or/not, et les chaînes de if/else imbriqués — sans avoir encore besoin de boucles ni du type option en détail, réservés aux modules suivants.

Contenu à valider manuellement dans un vrai environnement UEFN avant publication définitive (voir SPEC.md §7 — fidélité sémantique).

Exercices guidés

Exercice 1/7 · Objet à l'index

Objet à l'index

Complète ItemAtIndex : essaie de récupérer l'objet à Index dans Items, et renvoie "empty" si l'index est hors bornes.

Utilise la forme vue dans la leçon : if (Item := Items[Index]): ... else: .... L'indexation d'un tableau échoue toute seule quand l'index est invalide — pas besoin d'un test de longueur séparé.

Indices

Chargement de l'éditeur…

Quiz de compréhension

1

En Verse, que se passe-t-il concrètement quand Items[Index] est évalué avec un Index hors bornes ?

2

Dans if (A, B, C):, que doivent faire les trois clauses séparées par des virgules pour que la branche then s'exécute ?

3

Pourquoi X > 0? ne teste-t-il pas la comparaison entière comme on pourrait s'y attendre ?

4

Verse a-t-il un mot-clé elif pour enchaîner plusieurs branches de condition ?