Oefening: uitzonderingen genereren en vangen in een C#-consoletoepassing

Voltooid

In deze oefening ontwikkelt u een try codeblok en catch component in de instructies op het hoogste niveau, maakt en genereert u uitzonderingen in de MakeChange methode en voltooit u het catch codeblok met behulp van een uitzonderingsobject. Tijdens deze oefening voert u de volgende taken uit:

  1. Instructies op het hoogste niveau bijwerken: Implementeer een try-catch patroon in de instructies op het hoogste niveau. Het try codeblok bevat de aanroep naar MakeChange.
  2. Updatemethode MakeChange : Uitzonderingen maken en genereren voor problemen met Onvoldoende tot en met Underpayment.
  3. Werk het catch codeblok bij om eigenschappen van de gegenereerde uitzondering te gebruiken.
  4. Verificatietest: voer verificatietests uit voor de code die u in deze oefening ontwikkelt.

try-catch Een patroon toevoegen aan de instructies op het hoogste niveau

In deze taak plaatst u de aanroep van de MakeChange methode in een try instructie en maakt u de bijbehorende catch component.

  1. Zorg ervoor dat het Program.cs-bestand is geopend in de Visual Studio Code-editor.

  2. Zoek de volgende coderegels:

    // 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. Neem even de tijd om rekening te houden met het doel van deze code.

    U ziet dat MakeChange een tekenreekswaarde wordt geretourneerd. De retourwaarde wordt toegewezen aan een variabele met de naam transactionMessage. Als transactionMessage de transactie gelijk is aan 'transactie geslaagd', worden de kosten van het gekochte artikel toegevoegd aan registerCheckTillTotal. De variabele registerCheckTillTotal wordt gebruikt om het tot saldo te controleren dat door de MakeChange methode wordt berekend.

  4. Als u de aanroep van de MakeChange methode in een try instructiecodeblok wilt plaatsen, werkt u uw code als volgt bij:

    try
    {
        // MakeChange manages the transaction and updates the till 
        string transactionMessage = MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes);
    }
    
  5. Voeg de volgende catch component toe na het try instructiecodeblok:

    catch
    {
    }
    

    U voltooit het ontwikkelen van de catch component zodra u de uitzonderingen hebt gemaakt en gegenereerd.

Uitzonderingen maken en genereren in de MakeChange methode

In deze taak werkt MakeChange u bij om aangepaste uitzonderingen te maken en te genereren wanneer een transactie niet kan worden voltooid.

De MakeChange methode bevat twee problemen die tot uitzonderingen moeten leiden:

  • Probleem met onderbetalen: dit probleem treedt op wanneer de klant een betaling aanbiedt die lager is dan de kosten van het artikel. Als de klant onvoldoende betaling heeft aangeboden, MakeChange moet er een uitzondering worden gegenereerd.

  • Onvoldoende geldlade probleem: Dit probleem treedt op wanneer de kassa niet de biljetten bevat die nodig zijn om het exacte wisselgeld te geven. Als de till geen exacte wijziging kan aanbrengen, MakeChange moet u deze weggooien en uitzonderingen maken.

  1. Scrol omlaag naar de methode MakeChange.

  2. Zoek de volgende coderegels:

    if (changeNeeded < 0)
        transactionMessage = "Not enough money provided.";
    
  3. Neem even de tijd om na te denken over het probleem dat met deze code wordt opgelost.

    Als changeNeeded het minder dan nul is, heeft de klant onvoldoende geld verstrekt om de aankoopprijs van het artikel te dekken dat hij of zij koopt. De aankoopprijs en het geld dat door de klant wordt verstrekt, zijn parameters van de MakeChange methode. De methode kan de transactie niet voltooien wanneer de klant onvoldoende geld levert. Met andere woorden, de bewerking mislukt.

    Er zijn twee uitzonderingstypen die overeenkomen met deze voorwaarden:

    • InvalidOperationException: Er mag alleen een InvalidOperationException uitzondering worden gegenereerd wanneer de operationele voorwaarden van een methode geen ondersteuning bieden voor de geslaagde voltooiing van een bepaalde methodeaanroep. In dit geval worden de operationele voorwaarden vastgesteld door de parameters die aan de methode worden verstrekt.
    • ArgumentOutOfRangeException - Er mag alleen een ArgumentOutOfRangeException uitzondering worden gegenereerd wanneer de waarde van een argument zich buiten het toegestane bereik van waarden bevindt, zoals gedefinieerd door de aangeroepen methode. In dit geval moet het verstrekte geld groter zijn dan de kosten van het artikel.

    Elk uitzonderingstype kan werken, maar InvalidOperationException is een iets betere overeenkomst in de context van deze toepassing.

  4. Werk de code als volgt bij:

    if (changeNeeded < 0)
        throw new InvalidOperationException("InvalidOperationException: Not enough money provided to complete the transaction.");
    
  5. Schuif omlaag om de volgende coderegels te vinden:

    if (changeNeeded > 0)
        transactionMessage = "Can't make change. Do you have anything smaller?";
    
  6. Neem even de tijd om na te denken over het probleem dat met deze code wordt opgelost.

    Als changeNeeded deze groter is dan nul na de while lussen die de wijziging voorbereiden, zijn er geen rekeningen meer in rekening gebracht die kunnen worden gebruikt om wijzigingen aan te brengen. De methode kan de transactie niet voltooien wanneer de totdat de facturen ontbreken die nodig zijn om wijzigingen aan te brengen. Met andere woorden, de bewerking mislukt.

    De InvalidOperationException uitzondering moet worden gebruikt om de uitzondering te maken.

  7. Werk de code als volgt bij:

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

catch Het codeblok voltooien

In deze taak werkt u de catch component bij om een specifiek uitzonderingstype te vangen.

  1. Schuif omhoog boven de MakeChange methode en zoek de volgende code:

    catch
    {
    }    
    
  2. Werk de code als volgt bij om het uitzonderingstype te vangen dat in de MakeChange methode is opgetreden:

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

    Het InvalidOperationException uitzonderingsobject dat wordt MakeChange gegenereerd, wordt gevangen, maar andere uitzonderingstypen niet. Omdat u niet bent voorbereid om andere uitzonderingstypen af te handelen, is het belangrijk om ze lager in de aanroepstack te laten zitten. Als u weet dat er andere uitzonderingstypen worden verwacht MakeChange, kunt u extra catch componenten toevoegen.

  3. Gebruik het menu Bestand om uw updates op te slaan.

Converteer de Methode MakeChange van 'tekenreeks' naar 'void' en open uitzonderingseigenschappen

In deze taak werkt MakeChange u bij naar type voiden gebruikt u uitzonderingseigenschappen om details van het probleem aan de gebruiker te communiceren.

  1. Schuif naar het begin van de MakeChange methode.

  2. Als u de MakeChange methode van het type naar het type stringvoidwilt converteren, werkt u de code als volgt bij:

    static void MakeChange(int cost, int[] cashTill, int twenties, int tens = 0, int fives = 0, int ones = 0)
    
  3. Verwijder de volgende variabeledeclaratie:

    string transactionMessage = "";
    
  4. Schuif naar de onderkant van de MakeChange methode.

  5. Verwijder de volgende coderegels:

    if (transactionMessage == "")
        transactionMessage = "transaction succeeded";
    
    return transactionMessage;
    
  6. Schuif omhoog naar de instructies op het hoogste niveau en zoek het try codeblok.

  7. Werk het try codeblok als volgt bij:

    try
    {
        // MakeChange manages the transaction and updates the till 
        MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes);
    
        Console.WriteLine($"Transaction successfully completed.");
        registerCheckTillTotal += itemCost;
    }
    
  8. Zoek en verwijder vervolgens de volgende coderegels:

    // 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}");
    }
    
    

    De try en catch codeblokken communiceren nu de berichten 'geslaagd' en 'mislukt' aan de gebruiker. Aangezien de eigenschap van Message de uitzondering het probleem beschrijft, worden beide problemen opgelost met één Console.WriteLine() instructie. Uw code is gemakkelijker te lezen en te onderhouden na deze updates.

  9. Gebruik het menu Bestand om uw updates op te slaan.

Controleer uw werk

In deze taak voert u uw toepassing uit en controleert u of de bijgewerkte code naar behoren werkt.

  1. Schuif omhoog om de while lus te vinden in de instructies op het hoogste niveau.

    Deze lus wordt gebruikt om de transacties te herhalen.

  2. Zoek de volgende code een paar regels vóór het begin van de while lus.

    int transactions = 10;
    
    
  3. Werk het aantal transacties 40 als volgt bij:

    int transactions = 40;
    
    
  4. Zoek de volgende coderegel in de lus while .

    int itemCost = valueGenerator.Next(2, 20);
    
    
  5. Werk de itemCost generator voor willekeurige getallen als volgt bij:

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

    Dit kostenbereik is een betere overeenkomst voor items die klanten gaan kopen.

  6. Gebruik het menu Bestand om uw updates op te slaan.

  7. Selecteer in het menu Uitvoeren de foutopsporing starten.

  8. Controleer de uitvoer in het TERMINAL-deelvenster.

  9. Controleer of de berichten die zijn gekoppeld aan de twee uitzonderingstypen worden weergegeven:

    Uw transactierapport moet de volgende berichten bevatten: 'Kan transactie niet voltooien':

    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.
    
    

Gefeliciteerd, u hebt fouten in de kassatoepassing opgespoord om een codelogicaprobleem op te lossen en u hebt de toepassing bijgewerkt om de juiste technieken voor het afhandelen van uitzonderingen te gebruiken.

Notitie

De gerapporteerde uitvoer laat zien dat het geld tot niet langer evenwichtig is. Er zijn extra logische fouten in de code. Er is een uitdagingsprojectmodule beschikbaar als u geïnteresseerd bent in het demonstreren van uw visual Studio Code-foutopsporingsvaardigheden.