Cvičení – vyvolání a zachycení výjimek v konzolové aplikaci jazyka C#

Dokončeno

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:

  1. Aktualizujte příkazy nejvyšší úrovně: Implementujte try-catch vzor v příkazech nejvyšší úrovně. Blok try kódu bude obsahovat volání MakeChange.
  2. Metoda aktualizace MakeChange : Vytvoření a vyvolání výjimek pro problémy "Nedostatek do" a "Podplacení".
  3. catch Aktualizujte blok kódu tak, aby používal vlastnosti vyvolané výjimky.
  4. 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.

  1. Ujistěte se, že je soubor Program.cs otevřený v editoru visual Studio Code.

  2. 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}");
    }
    
  3. Zvažte účel tohoto kódu za chvilku.

    Všimněte si, že MakeChange vrací řetězcovou hodnotu. Vrácená hodnota je přiřazena proměnné s názvem transactionMessage. Pokud transactionMessage se rovná "transakce byla úspěšná", náklady na zakoupenou položku se přidají do registerCheckTillTotal. Proměnná registerCheckTillTotal se používá k ověření zůstatku vypočítaného metodou MakeChange .

  4. Chcete-li uzavřít volání MakeChange metody do try bloku 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);
    }
    
  5. Za blok kódu příkazu přidejte následující catch klauzuli try :

    catch
    {
    }
    

    Po vytvoření a vyvolání výjimek dokončíte vývoj catch klauzule.

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, MakeChange mě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, MakeChange měl by vyvolat výjimku a vyvolat výjimku.

  1. Přejděte dolů k metodě MakeChange.

  2. Vyhledejte následující řádky kódu:

    if (changeNeeded < 0)
        transactionMessage = "Not enough money provided.";
    
  3. Chvíli zvažte problém, který tento kód řeší.

    Pokud changeNeeded je 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 parametry MakeChange metody. 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ýjimka InvalidOperationException by 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ýjimka ArgumentOutOfRangeException by 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 InvalidOperationException v kontextu této aplikace se mírně lépe shodují.

  4. Následujícím způsobem aktualizujte kód:

    if (changeNeeded < 0)
        throw new InvalidOperationException("InvalidOperationException: Not enough money provided to complete the transaction.");
    
  5. 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?";
    
  6. Chvíli zvažte problém, který tento kód řeší.

    Pokud changeNeeded je za smyčkami, které tuto změnu připraví, větší než nula while , 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 InvalidOperationException by se měla použít k vytvoření výjimky.

  7. 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.

  1. Posuňte se nahoru nad metodu MakeChange a vyhledejte následující kód:

    catch
    {
    }    
    
  2. Chcete-li zachytit typ výjimky vyvolaný v MakeChange metodě, aktualizujte kód následujícím způsobem:

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

    Objekt InvalidOperationException výjimky vyvolaný bude MakeChange zachycen, 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ámci MakeChange, můžete přidat další catch klauzule.

  3. 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.

  1. Posuňte se na začátek MakeChange metody.

  2. Chcete-li převést metodu MakeChange z typu na typ stringvoid, 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)
    
  3. Odstraňte následující deklaraci proměnné:

    string transactionMessage = "";
    
  4. Posuňte se na konec MakeChange metody.

  5. Odstraňte následující řádky kódu:

    if (transactionMessage == "")
        transactionMessage = "transaction succeeded";
    
    return transactionMessage;
    
  6. Posuňte se nahoru k příkazům nejvyšší úrovně a vyhledejte try blok kódu.

  7. Aktualizujte try blok 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;
    }
    
  8. 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}");
    }
    
    

    try Bloky catch kódu nyní komunikují s uživatelem zprávy "success" a "failure". Vzhledem k tomu, že Message vlastnost výjimky popisuje problém, řeší jeden Console.WriteLine() příkaz oba problémy. Po těchto aktualizacích se kód snadněji čte a udržuje.

  9. 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í.

  1. Posuňte se nahoru a vyhledejte smyčku while v příkazech nejvyšší úrovně.

    Tato smyčka se používá k iteraci prostřednictvím transakcí.

  2. Před začátkem while smyčky vyhledejte následující kód několik řádků.

    int transactions = 10;
    
    
  3. Aktualizujte počet transakcí následujícím 40 způsobem:

    int transactions = 40;
    
    
  4. Ve smyčce vyhledejte následující řádek while kódu.

    int itemCost = valueGenerator.Next(2, 20);
    
    
  5. Následujícím způsobem aktualizujte generátor náhodných itemCost čísel:

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

    Tento rozsahnákladůch

  6. K uložení aktualizací použijte nabídku Soubor.

  7. V nabídce Spustit vyberte Spustit ladění.

  8. Zkontrolujte výstup na panelu TERMINAL.

  9. 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.