Cvičení – vyvolání a zachycení výjimek v konzolové aplikaci jazyka C#
V tomto cvičení vytvoříte try blok kódu a catch klauzuli v příkazech nejvyšší úrovně, vytvoříte a vyvoláte výjimky v MakeChange metodě a pak dokončíte catch blok kódu pomocí objektu výjimky. Během tohoto cvičení provedete následující úkoly:
- Aktualizujte příkazy nejvyšší úrovně: Implementujte
try-catchvzor v příkazech nejvyšší úrovně. Bloktrykódu bude obsahovat voláníMakeChange. - Metoda aktualizace
MakeChange: Vytvoření a vyvolání výjimek pro problémy "Nedostatek do" a "Podplacení". -
catchAktualizujte blok kódu tak, aby používal vlastnosti vyvolané výjimky. - Ověřovací test: Proveďte ověřovací testy pro kód, který vyvíjíte v tomto cvičení.
try-catch Přidání vzoru do příkazů nejvyšší úrovně
V této úloze uzavřete volání MakeChange metody do try příkazu a vytvoříte odpovídající catch klauzuli.
Ujistěte se, že je soubor Program.cs otevřený v editoru visual Studio Code.
Vyhledejte následující řádky kódu:
// 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}"); }Zvažte účel tohoto kódu za chvilku.
Všimněte si, že
MakeChangevrací řetězcovou hodnotu. Vrácená hodnota je přiřazena proměnné s názvemtransactionMessage. PokudtransactionMessagese rovná "transakce byla úspěšná", náklady na zakoupenou položku se přidají doregisterCheckTillTotal. ProměnnáregisterCheckTillTotalse používá k ověření zůstatku vypočítaného metodouMakeChange.Chcete-li uzavřít volání
MakeChangemetody dotrybloku kódu příkazu, aktualizujte kód následujícím způsobem:try { // MakeChange manages the transaction and updates the till string transactionMessage = MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes); }Za blok kódu příkazu přidejte následující
catchklauzulitry:catch { }Po vytvoření a vyvolání výjimek dokončíte vývoj
catchklauzule.
Vytvoření a vyvolání výjimek v MakeChange metodě
V této úloze aktualizujete MakeChange , abyste vytvořili a vyvolali vlastní výjimky, když transakci nelze dokončit.
Tato MakeChange metoda obsahuje dva problémy, které by měly vést k výjimkám:
Problém s podplacení: K tomuto problému dochází, když zákazník nabízí platbu, která je menší než náklady na položku. Pokud zákazník nenabízí dostatečnou platbu,
MakeChangeměl by vyvolat výjimku.Nedostatek do problému: K tomuto problému dochází v případě, že do té doby neobsahuje faktury potřebné k vytvoření přesné změny. Pokud till nemůže provést přesnou změnu,
MakeChangeměl by vyvolat výjimku a vyvolat výjimku.
Přejděte dolů k metodě
MakeChange.Vyhledejte následující řádky kódu:
if (changeNeeded < 0) transactionMessage = "Not enough money provided.";Chvíli zvažte problém, který tento kód řeší.
Pokud
changeNeededje menší než nula, zákazník nezadá dostatek peněz na pokrytí nákupní ceny položky, kterou si koupí. Nákupní cena a peníze poskytnuté zákazníkem jsou parametryMakeChangemetody. Metoda nemůže dokončit transakci, když zákazník neposkytuje dostatek peněz. Jinými slovy, operace selže.Existují dva typy výjimek, které odpovídají těmto podmínkám:
-
InvalidOperationException: VýjimkaInvalidOperationExceptionby měla být vyvolán pouze v případě, že provozní podmínky metody nepodporují úspěšné dokončení konkrétního volání metody. V tomto případě jsou provozní podmínky vytvořeny parametry zadanými metodou. -
ArgumentOutOfRangeException- VýjimkaArgumentOutOfRangeExceptionby měla být vyvolána pouze v případě, že hodnota argumentu je mimo povolený rozsah hodnot definovaný vyvolanou metodou. V takovém případě musí být poskytnuté peníze větší než náklady na položku.
Oba typy výjimek můžou fungovat, ale
InvalidOperationExceptionv kontextu této aplikace se mírně lépe shodují.-
Následujícím způsobem aktualizujte kód:
if (changeNeeded < 0) throw new InvalidOperationException("InvalidOperationException: Not enough money provided to complete the transaction.");Posuňte se dolů a vyhledejte následující řádky kódu:
if (changeNeeded > 0) transactionMessage = "Can't make change. Do you have anything smaller?";Chvíli zvažte problém, který tento kód řeší.
Pokud
changeNeededje za smyčkami, které tuto změnu připraví, větší než nulawhile, znamená to, že do té doby dojde k vypršení faktur, které je možné použít k provedení změny. Metoda nemůže dokončit transakci, když do té doby, než chybí faktury potřebné k provedení změny. Jinými slovy, operace selže.Výjimka
InvalidOperationExceptionby se měla použít k vytvoření výjimky.Následujícím způsobem aktualizujte kód:
if (changeNeeded > 0) throw new InvalidOperationException("InvalidOperationException: The till is unable to make the correct change.");
catch Dokončení bloku kódu
V tomto úkolu aktualizujete catch klauzuli tak, aby zachytila konkrétní typ výjimky.
Posuňte se nahoru nad metodu
MakeChangea vyhledejte následující kód:catch { }Chcete-li zachytit typ výjimky vyvolaný v
MakeChangemetodě, aktualizujte kód následujícím způsobem:catch (InvalidOperationException e) { Console.WriteLine($"Could not complete transaction: {e.Message}"); }Objekt
InvalidOperationExceptionvýjimky vyvolaný budeMakeChangezachycen, ale jiné typy výjimek nebudou. Vzhledem k tomu, že nejste připravení zpracovat jiné typy výjimek, je důležité je nechat je zachytit nižší v zásobníku volání. Pokud si uvědomíte, že jiné typy výjimek jsou očekávány v rámciMakeChange, můžete přidat dalšícatchklauzule.K uložení aktualizací použijte nabídku Soubor.
Převod metody MakeChange z "string" na "void" a vlastnosti výjimky přístupu
V této úloze se aktualizuje MakeChange na typ voida potom pomocí vlastností výjimky sdělíte uživateli podrobnosti o problému.
Posuňte se na začátek
MakeChangemetody.Chcete-li převést metodu
MakeChangez typu na typstringvoid, aktualizujte kód následujícím způsobem:static void MakeChange(int cost, int[] cashTill, int twenties, int tens = 0, int fives = 0, int ones = 0)Odstraňte následující deklaraci proměnné:
string transactionMessage = "";Posuňte se na konec
MakeChangemetody.Odstraňte následující řádky kódu:
if (transactionMessage == "") transactionMessage = "transaction succeeded"; return transactionMessage;Posuňte se nahoru k příkazům nejvyšší úrovně a vyhledejte
tryblok kódu.Aktualizujte
tryblok kódu následujícím způsobem:try { // MakeChange manages the transaction and updates the till MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes); Console.WriteLine($"Transaction successfully completed."); registerCheckTillTotal += itemCost; }Vyhledejte a odstraňte následující řádky kódu:
// 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}"); }tryBlokycatchkódu nyní komunikují s uživatelem zprávy "success" a "failure". Vzhledem k tomu, žeMessagevlastnost výjimky popisuje problém, řeší jedenConsole.WriteLine()příkaz oba problémy. Po těchto aktualizacích se kód snadněji čte a udržuje.K uložení aktualizací použijte nabídku Soubor.
Kontrola práce
V této úloze spustíte aplikaci a ověříte, že aktualizovaný kód funguje podle očekávání.
Posuňte se nahoru a vyhledejte smyčku
whilev příkazech nejvyšší úrovně.Tato smyčka se používá k iteraci prostřednictvím transakcí.
Před začátkem
whilesmyčky vyhledejte následující kód několik řádků.int transactions = 10;Aktualizujte počet transakcí následujícím
40způsobem:int transactions = 40;Ve smyčce vyhledejte následující řádek
whilekódu.int itemCost = valueGenerator.Next(2, 20);Následujícím způsobem aktualizujte generátor náhodných
itemCostčísel:int itemCost = valueGenerator.Next(2, 50);Tento rozsahnákladůch
K uložení aktualizací použijte nabídku Soubor.
V nabídce Spustit vyberte Spustit ladění.
Zkontrolujte výstup na panelu TERMINAL.
Ověřte, že se zobrazují zprávy přidružené ke dvěma typům výjimek:
Sestava transakcí by měla obsahovat následující zprávy "Nelze dokončit transakci":
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.
Blahopřejeme, odladili jste aplikaci v pokladně, abyste vyřešili problém s logikou kódu a aktualizovali jste aplikaci tak, aby používala správné techniky zpracování výjimek.
Poznámka:
Hlášený výstup ukazuje, že peníze do té doby už nejsou vyváženy. V kódu jsou další chyby logiky. Pokud chcete demonstrovat své dovednosti ladění editoru Visual Studio Code, je k dispozici modul projektu výzvy.