Exercice - Lever et intercepter des exceptions dans une application console C#

Effectué

Dans cet exercice, vous allez développer un bloc de code try et une clause catch dans les instructions de niveau supérieur, créer et lever des exceptions dans la méthode MakeChange, puis exécuter le bloc de code catch à l’aide d’un objet exception. Pendant cet exercice, vous effectuez les tâches suivantes :

  1. Mettre à jour des instructions de niveau supérieur : implémenter un modèle try-catch dans les instructions de niveau supérieur. Le bloc de code try contiendra l’appel à MakeChange.
  2. Mettre à jour la méthode MakeChange : créer et lever des exceptions pour les problèmes de « Caisse insuffisante » et de « Paiement non effectué ».
  3. Mettre à jour le bloc de code catch pour utiliser les propriétés de l’exception levée.
  4. Test de vérification : effectuez des tests de vérification pour le code que vous développez dans cet exercice.

Ajouter un modèle try-catch aux instructions de niveau supérieur

Dans cette tâche, vous allez placer l’appel à la méthode MakeChange à l’intérieur d’une instruction try et créer la clause catch correspondante.

  1. Vérifiez que le fichier Program.cs est ouvert dans l’Éditeur Visual Studio Code.

  2. Recherchez les lignes de code suivantes :

    // MakeChange manages the transaction and updates the till 
    string transactionMessage = MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes);
    
    // Backup Calculation - each transaction adds current "itemCost" to the till
    if (transactionMessage == "transaction succeeded")
    {
        Console.WriteLine($"Transaction successfully completed.");
        registerCheckTillTotal += itemCost;
    }
    else
    {
        Console.WriteLine($"Transaction unsuccessful: {transactionMessage}");
    }
    
  3. Prenez une minute pour réfléchir à l’objectif de ce code.

    Notez que MakeChange retourne une valeur de type chaîne. La valeur de retour est affectée à une variable nommée transactionMessage. Si transactionMessage a la valeur « Transaction réussie », le prix de l’article acheté est ajouté à registerCheckTillTotal. La variable registerCheckTillTotal est utilisée pour vérifier le solde de la caisse calculé par la méthode MakeChange.

  4. Pour placer l’appel à la méthode MakeChangedans un bloc de code d’instruction try, mettez à jour votre code comme suit :

    try
    {
        // MakeChange manages the transaction and updates the till 
        string transactionMessage = MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes);
    }
    
  5. Ajoutez la clause catch suivante après le bloc de code d’instruction try :

    catch
    {
    }
    

    Vous terminerez le développement de la clause catch une fois que vous aurez créé et levé les exceptions.

Créer et lever des exceptions dans la méthode MakeChange

Dans cette tâche, vous allez mettre à jour MakeChange pour créer et lever des exceptions personnalisées lorsqu’une transaction ne peut pas être effectuée.

La méthode MakeChange inclut deux problèmes qui doivent entraîner des exceptions :

  • Problème de non-paiement : ce problème se produit lorsque le client ne fournit pas la somme nécessaire pour couvrir le prix de l’article. Si le client n’a pas fourni la totalité du paiement, MakeChange doit lever une exception.

  • Problème de caisse insuffisante : ce problème se produit lorsque la caisse ne contient pas les billets nécessaires pour rendre la monnaie exacte. Si la caisse ne permet pas de rendre la monnaie exacte, MakeChange doit lever une exception.

  1. Allez jusqu’à la méthode MakeChange.

  2. Recherchez les lignes de code suivantes :

    if (changeNeeded < 0)
        transactionMessage = "Not enough money provided.";
    
  3. Prenez une minute pour examiner le problème que ce code résout.

    Si la valeur changeNeeded est inférieure à zéro, le client n’a pas fourni la somme nécessaire pour couvrir le prix d’achat de l’article qu’il achète. Le prix d’achat et la somme fournie par le client sont des paramètres de la méthode MakeChange. La méthode ne peut pas effectuer la transaction lorsque le client ne fournit pas la somme nécessaire. En d’autres termes, l’opération échoue.

    Il existe deux types d’exceptions qui semblent correspondre à ces conditions :

    • InvalidOperationException : une exception InvalidOperationException ne doit être levée que lorsque les conditions de fonctionnement d’une méthode ne prennent pas en charge la réussite d’un appel de méthode particulier. Dans ce cas, les conditions de fonctionnement sont établies par les paramètres fournis à la méthode.
    • ArgumentOutOfRangeException : une exception ArgumentOutOfRangeException doit être levée uniquement quand la valeur d’un argument se trouve en dehors de la plage de valeurs autorisées telle que définie par la méthode appelée. Dans ce cas, la somme fournie doit être supérieure au prix de l’article.

    L’un ou l’autre type d’exception peut fonctionner, mais InvalidOperationException constitue une correspondance légèrement meilleure dans le contexte de cette application.

  4. Mettez à jour le code comme suit :

    if (changeNeeded < 0)
        throw new InvalidOperationException("InvalidOperationException: Not enough money provided to complete the transaction.");
    
  5. Faites défiler l’écran vers le bas pour rechercher les lignes de code suivantes :

    if (changeNeeded > 0)
        transactionMessage = "Can't make change. Do you have anything smaller?";
    
  6. Prenez une minute pour examiner le problème que ce code résout.

    Si la valeur changeNeeded est supérieure à zéro après les boucles while qui préparent la monnaie, la caisse ne contient pas les billets permettant de rendre la monnaie. La méthode ne peut pas effectuer la transaction lorsque la caisse ne dispose pas des billets nécessaires pour rendre la monnaie. En d’autres termes, l’opération échoue.

    L’exception InvalidOperationException doit être utilisée pour créer l’exception.

  7. Mettez à jour le code comme suit :

    if (changeNeeded > 0)
        throw new InvalidOperationException("InvalidOperationException: The till is unable to make the correct change.");
    

Exécuter le bloc de code catch

Dans cette tâche, vous allez mettre à jour la clause catch pour intercepter un type d’exception spécifique.

  1. Faites défiler la méthode MakeChange vers le haut et recherchez le code suivant :

    catch
    {
    }    
    
  2. Pour intercepter le type d’exception levé dans la méthode MakeChange, mettez à jour le code comme suit :

    catch (InvalidOperationException e)
    {
        Console.WriteLine($"Could not complete transaction: {e.Message}");
    }    
    

    L’objet exception InvalidOperationException levé dans MakeChange est intercepté, mais pas les autres types d’exception. Étant donné que vous n’êtes pas préparé à la gestion d’autres types d’exception, il est important de les laisser être interceptés plus bas dans la pile des appels. Si vous vous rendez compte que d’autres types d’exception sont attendus dans MakeChange, vous pouvez ajouter des clauses catch supplémentaires.

  3. Utilisez le menu Fichier pour enregistrer vos mises à jour.

Convertir la méthode MakeChange du type « string » en type « void » et accéder aux propriétés des exceptions

Dans cette tâche, vous allez mettre à jour MakeChange pour qu’il soit du type void, puis utiliser les propriétés des exceptions pour communiquer les détails du problème à l’utilisateur.

  1. Faites défiler l’écran jusqu’en haut de la méthode MakeChange.

  2. Pour convertir la méthode MakeChange du type string en type void, mettez à jour le code comme suit :

    static void MakeChange(int cost, int[] cashTill, int twenties, int tens = 0, int fives = 0, int ones = 0)
    
  3. Supprimez la déclaration de variable suivante :

    string transactionMessage = "";
    
  4. Faites défiler l’écran jusqu’en bas de la méthode MakeChange.

  5. Supprimez les lignes de code suivantes :

    if (transactionMessage == "")
        transactionMessage = "transaction succeeded";
    
    return transactionMessage;
    
  6. Faites défiler l’écran jusqu’aux instructions de niveau supérieur, puis recherchez le bloc de code try.

  7. Mettez à jour le bloc de code try comme suit :

    try
    {
        // MakeChange manages the transaction and updates the till 
        MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes);
    
        Console.WriteLine($"Transaction successfully completed.");
        registerCheckTillTotal += itemCost;
    }
    
  8. Recherchez, puis supprimez les lignes de code suivantes :

    // Backup Calculation - each transaction adds current "itemCost" to the till
    if (transactionMessage == "transaction succeeded")
    {
        Console.WriteLine($"Transaction successfully completed.");
        registerCheckTillTotal += itemCost;
    }
    else
    {
        Console.WriteLine($"Transaction unsuccessful: {transactionMessage}");
    }
    
    

    Les blocs de code try et catch communiquent désormais les messages de « réussite » et de « échec » de transaction à l’utilisateur. Étant donné que la propriété Message de l’exception décrit le problème, une seule instruction Console.WriteLine() résout les deux problèmes. Votre code est plus facile à lire et à gérer après ces mises à jour.

  9. Utilisez le menu Fichier pour enregistrer vos mises à jour.

Vérifier votre travail

Dans cette tâche, vous allez exécuter votre application et vérifier que votre code mis à jour fonctionne comme prévu.

  1. Faites défiler l’écran vers le haut pour rechercher la boucle while dans les instructions de niveau supérieur.

    Cette boucle est utilisée pour itérer au sein des transactions.

  2. Recherchez le code suivant quelques lignes avant le début de la boucle while.

    int transactions = 10;
    
    
  3. Mettez à jour le nombre de transactions sur 40 comme suit :

    int transactions = 40;
    
    
  4. Recherchez la ligne de code suivante à l’intérieur de la boucle while.

    int itemCost = valueGenerator.Next(2, 20);
    
    
  5. Mettez à jour le générateur de nombres aléatoires itemCost comme suit :

    int itemCost = valueGenerator.Next(2, 50);
    
    

    Cette plage de prix correspond mieux aux articles que les clients achèteront.

  6. Utilisez le menu Fichier pour enregistrer vos mises à jour.

  7. Dans le menu Exécuter, sélectionnez Démarrer le débogage.

  8. Passez en revue la sortie dans le panneau TERMINAL.

  9. Vérifiez que les messages associés aux deux types d’exception sont affichés :

    Votre rapport de transactions doit inclure les messages « Could not make transaction » (Impossible d’achever la transaction) suivants :

    Customer is making a $42 purchase
             Using 2 twenty dollar bills
             Using 0 ten dollar bills
             Using 0 five dollar bills
             Using 0 one dollar bills
    Could not complete transaction: InvalidOperationException: Not enough money provided to complete the transaction.
    
    Customer is making a $23 purchase
             Using 2 twenty dollar bills
             Using 0 ten dollar bills
             Using 0 five dollar bills
             Using 1 one dollar bills
    Cashier prepares the following change:
             A five
             A five
             A one
             A one
    Could not complete transaction: InvalidOperationException: The till is unable to make change for the cash provided.
    
    

Félicitations, vous avez débogué l’application de caisse enregistreuse pour résoudre un problème de logique de code, et vous avez mis à jour l’application pour utiliser les techniques de gestion des exceptions appropriées.

Notes

La sortie signalée montre que la caisse n’est plus équilibrée. Il existe d’autres bogues logiques dans le code. Un module de projet de défi est disponible si vous souhaitez démontrer vos compétences de débogage Visual Studio Code !