Esercizio - Generare e intercettare eccezioni in un'applicazione console C#
In questo esercizio si svilupperà un blocco di codice try e una clausola catch nelle istruzioni di primo livello, si creeranno e generano eccezioni nel metodo MakeChange e quindi si completerà il blocco di codice catch usando un oggetto eccezione. In questo esercizio verranno completate le attività seguenti:
- Aggiornare le istruzioni di primo livello: implementare un modello
try-catchnelle istruzioni di primo livello. Il blocco di codicetryconterrà la chiamata aMakeChange. - Metodo di aggiornamento
MakeChange: creare e generare eccezioni per i problemi "Insufficienti fino a" e "Pagamento insufficiente". - Aggiornare il blocco di codice
catchper usare le proprietà dell'eccezione generata. - Test di verifica: eseguire test di verifica per il codice sviluppato in questo esercizio.
Aggiungere un modello try-catch alle istruzioni di primo livello
In questa attività si racchiuderà la chiamata al metodo MakeChange all'interno di un'istruzione try e si creerà la clausola catch corrispondente.
Assicurarsi che il file Program.cs sia aperto nell'editor di Visual Studio Code.
Individuare le righe di codice seguenti:
// 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}"); }Prendere in considerazione lo scopo di questo codice.
Si noti che
MakeChangerestituisce un valore stringa. Il valore restituito viene assegnato a una variabile denominatatransactionMessage. SetransactionMessageè uguale a "transazione riuscita", il costo dell'articolo acquistato viene aggiunto aregisterCheckTillTotal. La variabileregisterCheckTillTotalviene usata per verificare il saldo fino al saldo calcolato dal metodoMakeChange.Per racchiudere la chiamata al metodo
MakeChangein un blocco di codice dell'istruzionetry, aggiornare il codice nel modo seguente:try { // MakeChange manages the transaction and updates the till string transactionMessage = MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes); }Aggiungere la clausola
catchseguente dopo il blocco di codice dell'istruzionetry:catch { }Dopo aver creato e generato le eccezioni, si terminerà lo sviluppo della clausola
catch.
Creare e generare eccezioni nel metodo MakeChange
In questa attività si aggiornerà MakeChange per creare e generare eccezioni personalizzate quando non è possibile completare una transazione.
Il metodo MakeChange include due problemi che devono generare eccezioni:
Problema di pagamento insufficiente: questo problema si verifica quando il cliente offre un pagamento inferiore al costo dell'articolo. Se il cliente non ha offerto un pagamento sufficiente,
MakeChangedovrebbe generare un'eccezione.Problema di cassa insufficiente: Questo problema si verifica quando la cassa non contiene le banconote necessarie per produrre il resto esatto. Se la cassa non è in grado di dare il resto esatto,
MakeChangedeve generare un'eccezione.
Scorrere fino al metodo
MakeChange.Individuare le righe di codice seguenti:
if (changeNeeded < 0) transactionMessage = "Not enough money provided.";Prendetevi un minuto per considerare il problema che questo codice affronta.
Se
changeNeededè minore di zero, il cliente non ha fornito abbastanza denaro per coprire il prezzo di acquisto dell'articolo che sta acquistando. Il prezzo di acquisto e il denaro fornito dal cliente sono parametri del metodoMakeChange. Il metodo non è in grado di completare la transazione quando il cliente non fornisce denaro sufficiente. In altre parole, l'operazione ha esito negativo.Esistono due tipi di eccezione che sembrano corrispondere a queste condizioni:
-
InvalidOperationException: un’eccezioneInvalidOperationExceptiondeve essere generata solo quando le condizioni operative di un metodo non supportano il completamento corretto di una determinata chiamata al metodo. In questo caso le condizioni operative vengono stabilite dai parametri forniti al metodo. -
ArgumentOutOfRangeException: un’eccezioneArgumentOutOfRangeExceptiondeve essere generata solo quando il valore di un argomento non rientra nell'intervallo consentito di valori come definito dal metodo richiamato. In questo caso il denaro fornito deve essere maggiore del costo dell'articolo.
Entrambi i tipi di eccezione possono funzionare, ma
InvalidOperationExceptionè una corrispondenza leggermente migliore nel contesto di questa applicazione.-
Aggiornare il codice come segue:
if (changeNeeded < 0) throw new InvalidOperationException("InvalidOperationException: Not enough money provided to complete the transaction.");Scorrere verso il basso per individuare le righe di codice seguenti:
if (changeNeeded > 0) transactionMessage = "Can't make change. Do you have anything smaller?";Prendetevi un minuto per considerare il problema che questo codice affronta.
Se
changeNeededè maggiore di zero dopo i cicliwhileche preparano la modifica, allora la cassa ha esaurito le banconote che possono essere usate per fare il resto. Il metodo non è in grado di completare la transazione quando la cassa non dispone delle banconote necessarie per effettuare il cambio. In altre parole, l'operazione ha esito negativo.L'eccezione
InvalidOperationExceptiondeve essere usata per creare l'eccezione.Aggiornare il codice come segue:
if (changeNeeded > 0) throw new InvalidOperationException("InvalidOperationException: The till is unable to make the correct change.");
Completare il blocco di codice catch
In questa attività si aggiornerà la clausola catch per intercettare un tipo di eccezione specifico.
Scorrere verso l'alto sopra il metodo
MakeChangee individuare il codice seguente:catch { }Per intercettare il tipo di eccezione generato nel metodo
MakeChange, aggiornare il codice nel modo seguente:catch (InvalidOperationException e) { Console.WriteLine($"Could not complete transaction: {e.Message}"); }L'oggetto
InvalidOperationExceptioneccezione generato inMakeChangeverrà intercettato, ma altri tipi di eccezione non verranno rilevati. Poiché non si è pronti a gestire altri tipi di eccezione, è importante consentire che vengano rilevati più in basso nello stack di chiamate. Se si è consapevoli che altri tipi di eccezione sono previsti all'interno diMakeChange, è possibile aggiungere clausole aggiuntivecatch.Usare il menu File per salvare gli aggiornamenti.
Convertire il metodo MakeChange da "string" a "void" e accedere alle proprietà delle eccezioni
In questa attività si aggiornerà MakeChange in modo che sia di tipo voide quindi si useranno le proprietà delle eccezioni per comunicare i dettagli del problema all'utente.
Scorrere fino alla parte superiore del metodo
MakeChange.Per convertire il metodo
MakeChangedal tipostringal tipovoid, aggiornare il codice nel modo seguente:static void MakeChange(int cost, int[] cashTill, int twenties, int tens = 0, int fives = 0, int ones = 0)Eliminare la dichiarazione di variabile seguente:
string transactionMessage = "";Scorrere fino alla fine del metodo
MakeChange.Eliminare le righe di codice seguenti:
if (transactionMessage == "") transactionMessage = "transaction succeeded"; return transactionMessage;Scorrere verso l'alto fino alle istruzioni di primo livello e individuare il blocco di codice
try.Aggiornare il blocco di codice
trycome indicato di seguito:try { // MakeChange manages the transaction and updates the till MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes); Console.WriteLine($"Transaction successfully completed."); registerCheckTillTotal += itemCost; }Individuare ed eliminare le righe di codice seguenti:
// 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}"); }I blocchi di codice
tryecatchcomunicano ora i messaggi di "esito positivo" e "errore" della transazione all'utente. Poiché la proprietàMessagedell'eccezione descrive il problema, una singola istruzioneConsole.WriteLine()risolve entrambi i problemi. Il codice è più facile da leggere e gestire dopo questi aggiornamenti.Usare il menu File per salvare gli aggiornamenti.
Controlla il tuo lavoro
In questa attività si eseguirà l'applicazione e si verificherà che il codice aggiornato funzioni come previsto.
Scorrere verso l'alto per trovare il ciclo
whilenelle istruzioni di primo livello.Questo ciclo viene usato per scorrere le transazioni.
Individuare il codice seguente alcune righe prima dell'inizio del ciclo
while.int transactions = 10;Aggiornare il numero di transazioni in
40come indicato di seguito:int transactions = 40;Individuare la riga di codice seguente all'interno del ciclo
while.int itemCost = valueGenerator.Next(2, 20);Aggiornare il generatore di numeri casuali
itemCostcome indicato di seguito:int itemCost = valueGenerator.Next(2, 50);Questo intervallo di costi è una corrispondenza migliore per gli articoli che i clienti acquisteranno.
Usare il menu File per salvare gli aggiornamenti.
Nel menu Esegui, selezionare Avvia debug.
Esaminare l'output nel pannello TERMINALE.
Verificare che vengano visualizzati i messaggi associati ai due tipi di eccezione:
Il report delle transazioni deve includere i messaggi "Non è stato possibile effettuare la transazione" seguenti:
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.
È stato eseguito il debug dell'applicazione registro di cassa per risolvere un problema di logica del codice ed è stata aggiornata l'applicazione in modo da usare le tecniche di gestione delle eccezioni appropriate.
Nota
L'output riportato mostra che la cassa del denaro non è più bilanciata. Nel codice sono presenti bug logici aggiuntivi. Un modulo di progetto di verifica è disponibile se si è interessati a dimostrare le competenze di debug di Visual Studio Code.