Übung: Auslösen und Erfassen von Ausnahmen in einer C#-Konsolenanwendung

Abgeschlossen

In dieser Übung werden Sie einen try-Codeblock und eine catch-Klausel in den Anweisungen der obersten Ebene entwickeln, Ausnahmen in der MakeChange-Methode erstellen und auslösen und dann den catch-Codeblock mithilfe eines Ausnahmeobjekts abschließen. In dieser Übung führen Sie die folgenden Aufgaben aus:

  1. Aktualisieren von Anweisungen der obersten Ebene: Implementieren Sie ein try-catch-Muster in den Anweisungen der obersten Ebene. Der try-Codeblock enthält den Aufruf von MakeChange.
  2. Aktualisieren der MakeChange-Methode: Erstellen Sie Ausnahmen für die Probleme, bei denen nicht genügend Wechselgeld vorhanden ist oder die Zahlung nicht ausreicht, und lösen Sie diese Ausnahmen aus.
  3. Aktualisieren Sie den catch-Codeblock, um Eigenschaften der ausgelösten Ausnahme zu verwenden.
  4. Überprüfungstest: Führen Sie Überprüfungstests für den Code aus, den Sie in dieser Übung entwickeln.

Hinzufügen eines try-catch-Musters zu den Anweisungen der obersten Ebene

In dieser Aufgabe schließen Sie den Aufruf der MakeChange-Methode in eine try-Anweisung ein und erstellen die entsprechende catch-Klausel.

  1. Stellen Sie sicher, dass die Datei „Program.cs“ im Visual Studio Code-Editor geöffnet ist.

  2. Suchen Sie die folgenden Codezeilen:

    // 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. Nehmen Sie sich kurz Zeit, um den Zweck dieses Codes zu verstehen.

    Beachten Sie, dass MakeChange einen Zeichenfolgenwert zurückgibt. Der Rückgabewert wird einer Variablen namens transactionMessage zugewiesen. Wenn transactionMessage "transaction succeeded" entspricht, werden die Kosten für den gekauften Artikel zu registerCheckTillTotal hinzugefügt. Die Variable registerCheckTillTotal wird verwendet, um den von der MakeChange-Methode berechneten Saldo zu überprüfen.

  4. Um den Aufruf der MakeChange-Methode in einen try-Anweisungscodeblock einzuschließen, aktualisieren Sie den Code wie folgt:

    try
    {
        // MakeChange manages the transaction and updates the till 
        string transactionMessage = MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes);
    }
    
  5. Fügen Sie die folgende catch-Klausel nach dem try-Anweisungscodeblock hinzu:

    catch
    {
    }
    

    Sie schließen die Entwicklung der catch-Klausel ab, nachdem Sie die Ausnahmen erstellt und ausgelöst haben.

Erstellen und Auslösen von Ausnahmen in der MakeChange-Methode

In dieser Aufgabe aktualisieren Sie MakeChange, um benutzerdefinierte Ausnahmen zu erstellen und auszulösen, wenn eine Transaktion nicht abgeschlossen werden kann.

Die MakeChange-Methode enthält zwei Probleme, die zu Ausnahmen führen sollten:

  • Unterzahlungsproblem: Dieses Problem tritt auf, wenn der Kunde eine Zahlung anbietet, die kleiner als die Artikelkosten ist. Wenn die Zahlung des Kunden nicht ausreicht, sollte MakeChange eine Ausnahme auslösen.

  • Problem, bei dem nicht genügend Wechselgeld vorhanden ist: Dieses Problem tritt auf, wenn die Kasse nicht die Scheine enthält, die für das genaue Wechselgeld erforderlich sind. Wenn die Kasse nicht genügend Geld enthält, um den Betrag genau auszugleichen, sollte MakeChange eine Ausnahme auslösen.

  1. Scrollen Sie nach unten zur MakeChange-Methode.

  2. Suchen Sie die folgenden Codezeilen:

    if (changeNeeded < 0)
        transactionMessage = "Not enough money provided.";
    
  3. Nehmen Sie sich kurz Zeit, um das Problem zu verstehen, das durch diesen Code behoben wird.

    Wenn changeNeeded kleiner als null ist, hat der Kunde nicht genügend Geld bereitgestellt, um den Kaufpreis des Artikels zu decken. Der Kaufpreis und das vom Kunden bereitgestellte Geld sind Parameter der MakeChange-Methode. Die Methode kann die Transaktion nicht abschließen, wenn der Kunde nicht genügend Geld bereitstellt. Anders ausgedrückt: Der Vorgang schlägt fehl.

    Es gibt zwei Ausnahmetypen, die diesen Bedingungen zu entsprechen scheinen:

    • InvalidOperationException: Eine InvalidOperationException-Ausnahme sollte nur ausgelöst werden, wenn die Betriebsbedingungen einer Methode den erfolgreichen Abschluss eines bestimmten Methodenaufrufs nicht zulassen. In diesem Fall werden die Betriebsbedingungen durch die Parameter festgelegt, die für die Methode bereitgestellt werden.
    • ArgumentOutOfRangeException: Eine ArgumentOutOfRangeException-Ausnahme sollte nur ausgelöst werden, wenn der Wert eines Arguments außerhalb des zulässigen Wertebereichs liegt, der durch die aufgerufene Methode definiert ist. In diesem Fall muss der bereitgestellte Geldbetrag größer sein als die Kosten für den Artikel.

    Jeder Ausnahmetyp kann funktionieren, aber InvalidOperationException ist im Kontext dieser Anwendung die etwas bessere Wahl.

  4. Aktualisieren Sie den Code wie folgt:

    if (changeNeeded < 0)
        throw new InvalidOperationException("InvalidOperationException: Not enough money provided to complete the transaction.");
    
  5. Scrollen Sie nach unten, um die folgenden Codezeilen zu suchen:

    if (changeNeeded > 0)
        transactionMessage = "Can't make change. Do you have anything smaller?";
    
  6. Nehmen Sie sich kurz Zeit, um das Problem zu verstehen, das durch diesen Code behoben wird.

    Wenn changeNeeded nach den while-Schleifen, die die Änderung vorbereiten, größer als null ist, sind in der Kasse keine Scheine mehr verfügbar, die als Wechselgeld verwendet werden können. Die Methode kann die Transaktion nicht abschließen, wenn in der Kasse die für das Wechselgeld erforderlichen Scheine nicht verfügbar sind. Anders ausgedrückt: Der Vorgang schlägt fehl.

    Die InvalidOperationException-Ausnahme sollte zum Erstellen der Ausnahme verwendet werden.

  7. Aktualisieren Sie den Code wie folgt:

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

Abschließen des catch-Codeblocks

In dieser Aufgabe aktualisieren Sie die catch-Klausel, um einen bestimmten Ausnahmetyp zu erfassen.

  1. Scrollen Sie nach oben zur MakeChange-Methode, und suchen Sie den folgenden Code:

    catch
    {
    }    
    
  2. Aktualisieren Sie den Code wie folgt, um den in der MakeChange-Methode ausgelösten Ausnahmetyp zu erfassen:

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

    Das in InvalidOperationException ausgelöste MakeChange-Ausnahmeobjekt wird erfasst, andere Ausnahmetypen hingegen nicht. Da Sie andere Ausnahmetypen nicht verarbeiten können, ist es wichtig, diese weiter unten in der Aufrufliste zu erfassen. Wenn Sie feststellen, dass andere Ausnahmetypen in MakeChange erwartet werden, können Sie zusätzliche catch-Klauseln hinzufügen.

  3. Verwenden Sie das Menü "Datei ", um Ihre Updates zu speichern.

Konvertieren der MakeChange-Methode von „string“ in „void“ und Zugreifen auf Ausnahmeeigenschaften

In dieser Aufgabe aktualisieren Sie MakeChange auf den void-Typ und verwenden dann Ausnahmeeigenschaften, um den Benutzer*innen Problemdetails mitzuteilen.

  1. Scrollen Sie zum Anfang der MakeChange-Methode.

  2. Aktualisieren Sie den Code wie folgt, um die MakeChange-Methode vom string-Typ in den void-Typ zu konvertieren:

    static void MakeChange(int cost, int[] cashTill, int twenties, int tens = 0, int fives = 0, int ones = 0)
    
  3. Löschen Sie die folgende Variablendeklaration:

    string transactionMessage = "";
    
  4. Scrollen Sie zum Ende der MakeChange-Methode.

  5. Löschen Sie die folgenden Codezeilen:

    if (transactionMessage == "")
        transactionMessage = "transaction succeeded";
    
    return transactionMessage;
    
  6. Scrollen Sie nach oben zu den Anweisungen der obersten Ebene, und suchen Sie den try-Codeblock.

  7. Aktualisieren Sie den try-Codeblock wie folgt:

    try
    {
        // MakeChange manages the transaction and updates the till 
        MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes);
    
        Console.WriteLine($"Transaction successfully completed.");
        registerCheckTillTotal += itemCost;
    }
    
  8. Suchen und löschen Sie die folgenden Codezeilen:

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

    Die Codeblöcke try und catch kommunizieren nun die Transaktionsmeldungen „success“ und „failure“ an die Benutzer*innen. Da die Message-Eigenschaft der Ausnahme das Problem beschreibt, werden beide Probleme mit einer einzelnen Console.WriteLine()-Anweisung behoben. Ihr Code ist nach diesen Aktualisierungen einfacher zu lesen und zu verwalten.

  9. Verwenden Sie das Menü "Datei ", um Ihre Updates zu speichern.

Überprüfen Ihrer Arbeit

In dieser Aufgabe führen Sie Ihre Anwendung aus und überprüfen, ob der aktualisierte Code wie vorgesehen funktioniert.

  1. Scrollen Sie nach oben, um die while-Schleife in den Anweisungen der obersten Ebene zu finden.

    Diese Schleife wird verwendet, um die Transaktionen zu durchlaufen.

  2. Suchen Sie den folgenden Code einige Zeilen vor dem Anfang der while-Schleife.

    int transactions = 10;
    
    
  3. Gehen Sie wie folgt vor, um die Anzahl der Transaktionen auf 40 zu aktualisieren:

    int transactions = 40;
    
    
  4. Suchen Sie die folgende Codezeile in der while-Schleife.

    int itemCost = valueGenerator.Next(2, 20);
    
    
  5. Aktualisieren Sie den Zufallszahlengenerator itemCost wie folgt:

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

    Dieser Kostenbereich eignet sich besser für Artikel, die Kunden kaufen.

  6. Verwenden Sie das Menü "Datei ", um Ihre Updates zu speichern.

  7. Wählen Sie im Menü "Ausführen " die Option "Debuggen starten" aus.

  8. Überprüfen Sie die Ausgabe im Panel „Terminal“.

  9. Stellen Sie sicher, dass die Meldungen angezeigt werden, die den beiden Ausnahmetypen zugeordnet sind:

    Ihr Transaktionsbericht sollte die folgenden „Transaktion konnte nicht abgeschlossen werden“-Meldungen enthalten:

    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.
    
    

Glückwunsch! Sie haben die Registrierkassenanwendung debuggt, um ein Codelogikproblem zu beheben. Zudem haben Sie die Anwendung so aktualisiert, dass die richtigen Ausnahmebehandlungstechniken verwendet werden.

Hinweis

Die gemeldete Ausgabe zeigt, dass die Kasse nicht mehr ausbilanziert ist. Der Code enthält zusätzliche Logikfehler. Ein Projektmodul für Herausforderungen ist verfügbar, falls Sie Ihre Visual Studio Code-Debuggingfähigkeiten demonstrieren möchten.