Übung: Auslösen und Erfassen von Ausnahmen in einer C#-Konsolenanwendung
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:
- Aktualisieren von Anweisungen der obersten Ebene: Implementieren Sie ein
try-catch-Muster in den Anweisungen der obersten Ebene. Dertry-Codeblock enthält den Aufruf vonMakeChange. - 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. - Aktualisieren Sie den
catch-Codeblock, um Eigenschaften der ausgelösten Ausnahme zu verwenden. - Ü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.
Stellen Sie sicher, dass die Datei „Program.cs“ im Visual Studio Code-Editor geöffnet ist.
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}"); }Nehmen Sie sich kurz Zeit, um den Zweck dieses Codes zu verstehen.
Beachten Sie, dass
MakeChangeeinen Zeichenfolgenwert zurückgibt. Der Rückgabewert wird einer Variablen namenstransactionMessagezugewiesen. WenntransactionMessage"transaction succeeded" entspricht, werden die Kosten für den gekauften Artikel zuregisterCheckTillTotalhinzugefügt. Die VariableregisterCheckTillTotalwird verwendet, um den von derMakeChange-Methode berechneten Saldo zu überprüfen.Um den Aufruf der
MakeChange-Methode in einentry-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); }Fügen Sie die folgende
catch-Klausel nach demtry-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
MakeChangeeine 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
MakeChangeeine Ausnahme auslösen.
Scrollen Sie nach unten zur
MakeChange-Methode.Suchen Sie die folgenden Codezeilen:
if (changeNeeded < 0) transactionMessage = "Not enough money provided.";Nehmen Sie sich kurz Zeit, um das Problem zu verstehen, das durch diesen Code behoben wird.
Wenn
changeNeededkleiner 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 derMakeChange-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: EineInvalidOperationException-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: EineArgumentOutOfRangeException-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
InvalidOperationExceptionist im Kontext dieser Anwendung die etwas bessere Wahl.-
Aktualisieren Sie den Code wie folgt:
if (changeNeeded < 0) throw new InvalidOperationException("InvalidOperationException: Not enough money provided to complete the transaction.");Scrollen Sie nach unten, um die folgenden Codezeilen zu suchen:
if (changeNeeded > 0) transactionMessage = "Can't make change. Do you have anything smaller?";Nehmen Sie sich kurz Zeit, um das Problem zu verstehen, das durch diesen Code behoben wird.
Wenn
changeNeedednach denwhile-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.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.
Scrollen Sie nach oben zur
MakeChange-Methode, und suchen Sie den folgenden Code:catch { }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
InvalidOperationExceptionausgelösteMakeChange-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 inMakeChangeerwartet werden, können Sie zusätzlichecatch-Klauseln hinzufügen.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.
Scrollen Sie zum Anfang der
MakeChange-Methode.Aktualisieren Sie den Code wie folgt, um die
MakeChange-Methode vomstring-Typ in denvoid-Typ zu konvertieren:static void MakeChange(int cost, int[] cashTill, int twenties, int tens = 0, int fives = 0, int ones = 0)Löschen Sie die folgende Variablendeklaration:
string transactionMessage = "";Scrollen Sie zum Ende der
MakeChange-Methode.Löschen Sie die folgenden Codezeilen:
if (transactionMessage == "") transactionMessage = "transaction succeeded"; return transactionMessage;Scrollen Sie nach oben zu den Anweisungen der obersten Ebene, und suchen Sie den
try-Codeblock.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; }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
tryundcatchkommunizieren nun die Transaktionsmeldungen „success“ und „failure“ an die Benutzer*innen. Da dieMessage-Eigenschaft der Ausnahme das Problem beschreibt, werden beide Probleme mit einer einzelnenConsole.WriteLine()-Anweisung behoben. Ihr Code ist nach diesen Aktualisierungen einfacher zu lesen und zu verwalten.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.
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.
Suchen Sie den folgenden Code einige Zeilen vor dem Anfang der
while-Schleife.int transactions = 10;Gehen Sie wie folgt vor, um die Anzahl der Transaktionen auf
40zu aktualisieren:int transactions = 40;Suchen Sie die folgende Codezeile in der
while-Schleife.int itemCost = valueGenerator.Next(2, 20);Aktualisieren Sie den Zufallszahlengenerator
itemCostwie folgt:int itemCost = valueGenerator.Next(2, 50);Dieser Kostenbereich eignet sich besser für Artikel, die Kunden kaufen.
Verwenden Sie das Menü "Datei ", um Ihre Updates zu speichern.
Wählen Sie im Menü "Ausführen " die Option "Debuggen starten" aus.
Überprüfen Sie die Ausgabe im Panel „Terminal“.
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.