Oefening: uitzonderingen genereren en vangen in een C#-consoletoepassing
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:
- Instructies op het hoogste niveau bijwerken: Implementeer een
try-catchpatroon in de instructies op het hoogste niveau. Hettrycodeblok bevat de aanroep naarMakeChange. - Updatemethode
MakeChange: Uitzonderingen maken en genereren voor problemen met Onvoldoende tot en met Underpayment. - Werk het
catchcodeblok bij om eigenschappen van de gegenereerde uitzondering te gebruiken. - 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.
Zorg ervoor dat het Program.cs-bestand is geopend in de Visual Studio Code-editor.
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}"); }Neem even de tijd om rekening te houden met het doel van deze code.
U ziet dat
MakeChangeeen tekenreekswaarde wordt geretourneerd. De retourwaarde wordt toegewezen aan een variabele met de naamtransactionMessage. AlstransactionMessagede transactie gelijk is aan 'transactie geslaagd', worden de kosten van het gekochte artikel toegevoegd aanregisterCheckTillTotal. De variabeleregisterCheckTillTotalwordt gebruikt om het tot saldo te controleren dat door deMakeChangemethode wordt berekend.Als u de aanroep van de
MakeChangemethode in eentryinstructiecodeblok 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); }Voeg de volgende
catchcomponent toe na hettryinstructiecodeblok:catch { }U voltooit het ontwikkelen van de
catchcomponent 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,
MakeChangemoet 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,
MakeChangemoet u deze weggooien en uitzonderingen maken.
Scrol omlaag naar de methode
MakeChange.Zoek de volgende coderegels:
if (changeNeeded < 0) transactionMessage = "Not enough money provided.";Neem even de tijd om na te denken over het probleem dat met deze code wordt opgelost.
Als
changeNeededhet 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 deMakeChangemethode. 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 eenInvalidOperationExceptionuitzondering 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 eenArgumentOutOfRangeExceptionuitzondering 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
InvalidOperationExceptionis een iets betere overeenkomst in de context van deze toepassing.-
Werk de code als volgt bij:
if (changeNeeded < 0) throw new InvalidOperationException("InvalidOperationException: Not enough money provided to complete the transaction.");Schuif omlaag om de volgende coderegels te vinden:
if (changeNeeded > 0) transactionMessage = "Can't make change. Do you have anything smaller?";Neem even de tijd om na te denken over het probleem dat met deze code wordt opgelost.
Als
changeNeededdeze groter is dan nul na dewhilelussen 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
InvalidOperationExceptionuitzondering moet worden gebruikt om de uitzondering te maken.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.
Schuif omhoog boven de
MakeChangemethode en zoek de volgende code:catch { }Werk de code als volgt bij om het uitzonderingstype te vangen dat in de
MakeChangemethode is opgetreden:catch (InvalidOperationException e) { Console.WriteLine($"Could not complete transaction: {e.Message}"); }Het
InvalidOperationExceptionuitzonderingsobject dat wordtMakeChangegegenereerd, 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 verwachtMakeChange, kunt u extracatchcomponenten toevoegen.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.
Schuif naar het begin van de
MakeChangemethode.Als u de
MakeChangemethode van het type naar het typestringvoidwilt 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)Verwijder de volgende variabeledeclaratie:
string transactionMessage = "";Schuif naar de onderkant van de
MakeChangemethode.Verwijder de volgende coderegels:
if (transactionMessage == "") transactionMessage = "transaction succeeded"; return transactionMessage;Schuif omhoog naar de instructies op het hoogste niveau en zoek het
trycodeblok.Werk het
trycodeblok 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; }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
tryencatchcodeblokken communiceren nu de berichten 'geslaagd' en 'mislukt' aan de gebruiker. Aangezien de eigenschap vanMessagede uitzondering het probleem beschrijft, worden beide problemen opgelost met éénConsole.WriteLine()instructie. Uw code is gemakkelijker te lezen en te onderhouden na deze updates.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.
Schuif omhoog om de
whilelus te vinden in de instructies op het hoogste niveau.Deze lus wordt gebruikt om de transacties te herhalen.
Zoek de volgende code een paar regels vóór het begin van de
whilelus.int transactions = 10;Werk het aantal transacties
40als volgt bij:int transactions = 40;Zoek de volgende coderegel in de lus
while.int itemCost = valueGenerator.Next(2, 20);Werk de
itemCostgenerator voor willekeurige getallen als volgt bij:int itemCost = valueGenerator.Next(2, 50);Dit kostenbereik is een betere overeenkomst voor items die klanten gaan kopen.
Gebruik het menu Bestand om uw updates op te slaan.
Selecteer in het menu Uitvoeren de foutopsporing starten.
Controleer de uitvoer in het TERMINAL-deelvenster.
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.