Esercizio - Generare e intercettare eccezioni in un'applicazione console C#

Completato

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:

  1. Aggiornare le istruzioni di primo livello: implementare un modello try-catch nelle istruzioni di primo livello. Il blocco di codice try conterrà la chiamata a MakeChange.
  2. Metodo di aggiornamento MakeChange: creare e generare eccezioni per i problemi "Insufficienti fino a" e "Pagamento insufficiente".
  3. Aggiornare il blocco di codice catch per usare le proprietà dell'eccezione generata.
  4. 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.

  1. Assicurarsi che il file Program.cs sia aperto nell'editor di Visual Studio Code.

  2. 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}");
    }
    
  3. Prendere in considerazione lo scopo di questo codice.

    Si noti che MakeChange restituisce un valore stringa. Il valore restituito viene assegnato a una variabile denominata transactionMessage. Se transactionMessage è uguale a "transazione riuscita", il costo dell'articolo acquistato viene aggiunto a registerCheckTillTotal. La variabile registerCheckTillTotal viene usata per verificare il saldo fino al saldo calcolato dal metodo MakeChange.

  4. Per racchiudere la chiamata al metodo MakeChange in un blocco di codice dell'istruzione try, aggiornare il codice nel modo seguente:

    try
    {
        // MakeChange manages the transaction and updates the till 
        string transactionMessage = MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes);
    }
    
  5. Aggiungere la clausola catch seguente dopo il blocco di codice dell'istruzione try:

    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, MakeChange dovrebbe 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.

  1. Scorrere fino al metodo MakeChange.

  2. Individuare le righe di codice seguenti:

    if (changeNeeded < 0)
        transactionMessage = "Not enough money provided.";
    
  3. 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 metodo MakeChange. 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’eccezione InvalidOperationException deve 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’eccezione ArgumentOutOfRangeException deve 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.

  4. Aggiornare il codice come segue:

    if (changeNeeded < 0)
        throw new InvalidOperationException("InvalidOperationException: Not enough money provided to complete the transaction.");
    
  5. Scorrere verso il basso per individuare le righe di codice seguenti:

    if (changeNeeded > 0)
        transactionMessage = "Can't make change. Do you have anything smaller?";
    
  6. Prendetevi un minuto per considerare il problema che questo codice affronta.

    Se changeNeeded è maggiore di zero dopo i cicli while che 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 InvalidOperationException deve essere usata per creare l'eccezione.

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

  1. Scorrere verso l'alto sopra il metodo MakeChange e individuare il codice seguente:

    catch
    {
    }    
    
  2. 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 InvalidOperationException eccezione generato in MakeChange verrà 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 di MakeChange, è possibile aggiungere clausole aggiuntive catch.

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

  1. Scorrere fino alla parte superiore del metodo MakeChange.

  2. Per convertire il metodo MakeChange dal tipo string al tipo void, aggiornare il codice nel modo seguente:

    static void MakeChange(int cost, int[] cashTill, int twenties, int tens = 0, int fives = 0, int ones = 0)
    
  3. Eliminare la dichiarazione di variabile seguente:

    string transactionMessage = "";
    
  4. Scorrere fino alla fine del metodo MakeChange.

  5. Eliminare le righe di codice seguenti:

    if (transactionMessage == "")
        transactionMessage = "transaction succeeded";
    
    return transactionMessage;
    
  6. Scorrere verso l'alto fino alle istruzioni di primo livello e individuare il blocco di codice try.

  7. Aggiornare il blocco di codice try come 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;
    }
    
  8. 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 try e catch comunicano ora i messaggi di "esito positivo" e "errore" della transazione all'utente. Poiché la proprietà Message dell'eccezione descrive il problema, una singola istruzione Console.WriteLine() risolve entrambi i problemi. Il codice è più facile da leggere e gestire dopo questi aggiornamenti.

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

  1. Scorrere verso l'alto per trovare il ciclo while nelle istruzioni di primo livello.

    Questo ciclo viene usato per scorrere le transazioni.

  2. Individuare il codice seguente alcune righe prima dell'inizio del ciclo while.

    int transactions = 10;
    
    
  3. Aggiornare il numero di transazioni in 40 come indicato di seguito:

    int transactions = 40;
    
    
  4. Individuare la riga di codice seguente all'interno del ciclo while.

    int itemCost = valueGenerator.Next(2, 20);
    
    
  5. Aggiornare il generatore di numeri casuali itemCost come indicato di seguito:

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

    Questo intervallo di costi è una corrispondenza migliore per gli articoli che i clienti acquisteranno.

  6. Usare il menu File per salvare gli aggiornamenti.

  7. Nel menu Esegui, selezionare Avvia debug.

  8. Esaminare l'output nel pannello TERMINALE.

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