Le quartierC# C#Pièce 3/7Débutant

Collections et exceptions

Stocker plusieurs valeurs avec List et Dictionary, puis gérer les erreurs d'exécution avec try, catch et finally.

Ce que tu vas apprendre

  • Garder plusieurs valeurs dans une List et les retrouver par clé dans un Dictionary.
  • Comprendre ce qu'est une exception et l'attraper avec try et catch.
  • Convertir une saisie sans faire planter le programme.

La liste

Une recette a plusieurs ingrédients. Une liste (List<T>) garde une série de valeurs du même type, dans l'ordre, et peut grandir.

var ingredients = new List<string> { "farine", "oeufs", "lait" };

ingredients.Add("sucre");
ingredients.Remove("lait");

Console.WriteLine(ingredients.Count);   // 3
Console.WriteLine(ingredients[0]);      // farine

Le type entre chevrons, <string>, indique ce que la liste contient. On l'appelle le type générique.

Les éléments sont numérotés à partir de 0 : le premier est ingredients[0]. Demander un numéro qui n'existe pas provoque une erreur.

Parcourir et tester une liste

Tu utilises foreach pour parcourir une liste :

foreach (string ingredient in ingredients)
{
    Console.WriteLine($"- {ingredient}");
}

if (ingredients.Contains("sucre"))
{
    Console.WriteLine("Il y a du sucre");
}
MembreEffet
Add(x)Ajoute à la fin
Remove(x)Retire la première occurrence
Contains(x)Dit si la valeur est présente
CountNombre d'éléments
[i]Lit l'élément numéro i

Le dictionnaire

Un dictionnaire (Dictionary<TKey, TValue>) associe une clé à une valeur, comme un carnet où tu retrouves un prix à partir d'un nom.

var prix = new Dictionary<string, double>
{
    ["Crêpes"] = 3.5,
    ["Gaufres"] = 4.0
};

prix["Tarte"] = 5.5;
Console.WriteLine(prix["Crêpes"]);   // 3.5

Chaque clé est unique. Écrire prix["Tarte"] = ... ajoute l'entrée si elle n'existe pas, ou remplace sa valeur sinon.

Chercher sans risque avec TryGetValue

Lire prix["Pizza"] alors que cette clé n'existe pas provoque une erreur. Pour tester d'abord, utilise TryGetValue :

if (prix.TryGetValue("Pizza", out double valeur))
{
    Console.WriteLine($"Prix : {valeur}");
}
else
{
    Console.WriteLine("Recette inconnue");
}

La méthode renvoie true si la clé existe et, dans ce cas, remplit la variable après out. Le mot-clé out signifie que la méthode renvoie une seconde valeur par ce paramètre.

Pour parcourir un dictionnaire, chaque élément porte une Key et une Value :

foreach (var paire in prix)
{
    Console.WriteLine($"{paire.Key} : {paire.Value}");
}

Les exceptions

Parfois, le programme rencontre une situation impossible : une division par zéro, un fichier absent, un texte qui n'est pas un nombre. Il lève alors une exception, un objet qui décrit l'erreur. Sans traitement, le programme s'arrête.

int portions = int.Parse("quatre");   // lève une FormatException

Pour réagir, entoure le code risqué d'un bloc try et récupère l'erreur dans un bloc catch :

try
{
    int portions = int.Parse("quatre");
    Console.WriteLine(portions);
}
catch (FormatException)
{
    Console.WriteLine("Ce n'est pas un nombre");
}

Si aucune erreur n'a lieu dans try, le bloc catch est ignoré. Sinon, le programme saute directement au catch correspondant.

finally et throw

Le bloc finally s'exécute dans tous les cas, avec ou sans erreur. Il sert à libérer ce qui a été ouvert (un fichier, une connexion).

try
{
    Console.WriteLine("Lecture de la recette");
}
catch (Exception ex)
{
    Console.WriteLine($"Erreur : {ex.Message}");
}
finally
{
    Console.WriteLine("Fin du traitement");
}

Exception est le type de base : catch (Exception ex) attrape toutes les erreurs, et ex.Message donne le texte de l'erreur. Mets les catch précis avant les catch généraux.

Tu peux aussi lever toi-même une exception avec throw :

static void VerifierPortions(int portions)
{
    if (portions <= 0)
    {
        throw new ArgumentException("Les portions doivent être positives");
    }
}
Pour relancer l'erreur après l'avoir notée, écris throw; seul dans le catch. Tu gardes ainsi les informations d'origine.

Préférer TryParse pour les saisies

Une saisie incorrecte est un cas normal, pas une situation exceptionnelle. Pour convertir un texte en nombre, int.TryParse évite l'exception :

Console.WriteLine("Combien de portions ?");
string? saisie = Console.ReadLine();

if (int.TryParse(saisie, out int portions))
{
    Console.WriteLine($"Recette pour {portions} personnes");
}
else
{
    Console.WriteLine("Merci de saisir un nombre entier");
}
Réserve try et catch aux vrais imprévus (fichier manquant, réseau coupé). Pour les cas que tu peux tester avant, un if ou un TryParse est plus simple et plus clair.

À retenir

  • List<T> garde des valeurs dans l'ordre : Add, Remove, Contains, Count, et [i] à partir de 0.
  • Dictionary<TKey, TValue> associe une clé unique à une valeur ; utilise TryGetValue quand la clé peut manquer.
  • Une exception décrit une erreur à l'exécution ; sans catch, le programme s'arrête.
  • try entoure le code risqué, catch traite l'erreur, finally s'exécute dans tous les cas, throw lève une erreur.
  • Pour une saisie, int.TryParse est préférable à int.Parse suivi d'un catch.

Pour aller plus loin

Sources officielles

Ensuite

Projet
Lignes de code
Niveau
Le quartier
Appartement
C#
Pièce
3/7
Plan n°
csharp/03.collections-et-exceptions
Lignes de code · fiches rédigées à partir des documentations officielles, sources citées en bas de chaque page.