Exerciții - Aruncați și surprindeți excepții într-o aplicație consolă C#

Finalizat

În acest exercițiu, veți dezvolta un bloc de cod și o try clauză în instrucțiunile de nivel superior, veți crea și genera excepții în catch metodă, apoi veți finaliza blocul MakeChange de cod utilizând un obiect de catch excepție. Efectuați următoarele activități în timpul acestui exercițiu:

  1. Actualizați instrucțiunile de nivel superior: Implementați un try-catch model în instrucțiunile de nivel superior. Blocul try de cod va conține apelul către MakeChange.
  2. Metoda de actualizare MakeChange : Creați și generați excepții pentru problemele "Insuficientă până" și "Subplată".
  3. Actualizați blocul de catch cod pentru a utiliza proprietățile excepției lansate.
  4. Test de verificare: efectuați teste de verificare pentru codul pe care îl dezvoltați în acest exercițiu.

Adăugarea unui try-catch model la instrucțiunile de nivel superior

În această activitate, veți încadra apelul la MakeChange metoda dintr-o try instrucțiune și veți crea clauza corespunzătoare catch .

  1. Asigurați-vă că fișierul Program.cs este deschis în Visual Studio Code Editor.

  2. Găsiți următoarele linii de cod:

    // 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. Luați un minut pentru a lua în considerare scopul acestui cod.

    Observați că MakeChange returnează o valoare șir. Valoarea returnată este atribuită unei variabile denumite transactionMessage. Dacă transactionMessage este egal cu "tranzacție reușită", atunci costul articolului achiziționat este adăugat la registerCheckTillTotal. Variabila registerCheckTillTotal este utilizată pentru a verifica soldul până la calculul metodei MakeChange .

  4. Pentru a încadra apelul la metoda dintr-un MakeChange bloc de try cod de instrucțiune, actualizați codul după cum urmează:

    try
    {
        // MakeChange manages the transaction and updates the till 
        string transactionMessage = MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes);
    }
    
  5. Adăugați următoarea catch clauză după blocul codului de try instrucțiune:

    catch
    {
    }
    

    Veți termina de dezvoltat catch clauza după ce ați creat și ați lansat excepțiile.

Crearea și aruncarea excepțiilor MakeChange în metodă

În această activitate, veți actualiza MakeChange pentru a crea și a genera excepții particularizate atunci când o tranzacție nu poate fi finalizată.

Metoda MakeChange include două probleme care ar trebui să ducă la excepții:

  • Problemă cu plata: Această problemă apare atunci când clientul oferă o plată mai mică decât costul articolului. Dacă clientul nu a oferit o plată suficientă, MakeChange ar trebui să genereze o excepție.

  • Insuficientă până la problemă: Această problemă apare atunci când nu conține facturile necesare pentru a produce modificarea exactă. Dacă până nu pot face modificări exacte, MakeChange ar trebui să arunce și excepție.

  1. Defilați în jos la metoda MakeChange.

  2. Găsiți următoarele linii de cod:

    if (changeNeeded < 0)
        transactionMessage = "Not enough money provided.";
    
  3. Aveți nevoie de un minut pentru a lua în considerare problema pe care o abordează acest cod.

    Dacă changeNeeded este mai mic decât zero, clientul nu a furnizat destui bani pentru a acoperi prețul de achiziție al articolului pe care îl cumpără. Prețul achiziției și banii furnizați de client sunt parametrii metodei MakeChange . Metoda nu poate finaliza tranzacția atunci când clientul nu furnizează destui bani. Cu alte cuvinte, operațiunea nu reușește.

    Există două tipuri de excepții care par să corespundă acestor condiții:

    • InvalidOperationException: Ar trebui să fie lansată o InvalidOperationException excepție doar atunci când condițiile de funcționare ale unei metode nu acceptă finalizarea cu succes a unui anumit apel de metodă. În acest caz, condițiile de funcționare sunt stabilite de parametrii furnizați metodei.
    • ArgumentOutOfRangeException - O ArgumentOutOfRangeException excepție ar trebui să fie lansată doar atunci când valoarea unui argument se află în afara intervalului permis de valori, așa cum este definit de metoda invocată. În acest caz, banii furnizați trebuie să fie mai mari decât costul articolului.

    Oricare tip de excepție poate funcționa, dar InvalidOperationException este o potrivire ușor mai bună în contextul acestei aplicații.

  4. Actualizați codul după cum urmează:

    if (changeNeeded < 0)
        throw new InvalidOperationException("InvalidOperationException: Not enough money provided to complete the transaction.");
    
  5. Defilați în jos pentru a găsi următoarele linii de cod:

    if (changeNeeded > 0)
        transactionMessage = "Can't make change. Do you have anything smaller?";
    
  6. Aveți nevoie de un minut pentru a lua în considerare problema pe care o abordează acest cod.

    Dacă changeNeeded este mai mare decât zero după while buclele care pregătesc modificarea, atunci până când nu mai are facturi care pot fi utilizate pentru a face modificări. Metoda nu poate finaliza tranzacția atunci când nu există facturile necesare pentru a face modificări. Cu alte cuvinte, operațiunea nu reușește.

    Excepția InvalidOperationException ar trebui utilizată pentru a crea excepția.

  7. Actualizați codul după cum urmează:

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

Finalizați blocul de catch cod

În această activitate, veți actualiza catch clauza pentru a prinde un anumit tip de excepție.

  1. Defilați în sus deasupra metodei MakeChange și găsiți următorul cod:

    catch
    {
    }    
    
  2. Pentru a surprinde tipul de excepție lansat în MakeChange metodă, actualizați codul după cum urmează:

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

    Obiectul InvalidOperationException excepție lansat va MakeChange fi prins, dar alte tipuri de excepții nu vor fi. Deoarece nu sunteți pregătit să gestionați alte tipuri de excepții, este important să le permiteți să fie prinse mai jos în stiva de apeluri. Dacă sunteți conștient de faptul că alte tipuri de excepții sunt așteptate în cadrul MakeChange, puteți adăuga clauze suplimentare catch .

  3. Utilizați meniul Fișier pentru a salva actualizările.

Conversia metodei MakeChange de la "șir" la "nul" și proprietăți de excepție de acces

În această activitate, veți actualiza MakeChange la tipul void, apoi veți utiliza proprietățile de excepție pentru a comunica detalii despre problemă utilizatorului.

  1. Defilați în partea de sus a metodei MakeChange .

  2. Pentru a efectua conversia metodei MakeChange de la tip la tip stringvoid, actualizați codul după cum urmează:

    static void MakeChange(int cost, int[] cashTill, int twenties, int tens = 0, int fives = 0, int ones = 0)
    
  3. Ștergeți următoarea declarație de variabilă:

    string transactionMessage = "";
    
  4. Defilați în partea de jos a metodei MakeChange .

  5. Ștergeți următoarele linii de cod:

    if (transactionMessage == "")
        transactionMessage = "transaction succeeded";
    
    return transactionMessage;
    
  6. Defilați în sus la instrucțiunile de nivel superior și găsiți blocul de try cod.

  7. Actualizați blocul de try cod după cum urmează:

    try
    {
        // MakeChange manages the transaction and updates the till 
        MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes);
    
        Console.WriteLine($"Transaction successfully completed.");
        registerCheckTillTotal += itemCost;
    }
    
  8. Găsiți și apoi ștergeți următoarele linii de cod:

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

    Blocurile try de cod și catch comunică acum mesajele de tranzacție "succes" și "nereușită" utilizatorului. Deoarece proprietatea excepției Message descrie problema, o singură Console.WriteLine() instrucțiune tratează ambele probleme. Codul dvs. este mai ușor de citit și de întreținut după aceste actualizări.

  9. Utilizați meniul Fișier pentru a salva actualizările.

Verificați-vă activitatea

În această activitate, veți rula aplicația și veți verifica dacă codul actualizat funcționează așa cum doriți.

  1. Defilați în sus pentru a găsi bucla while în instrucțiunile de nivel superior.

    Această buclă este utilizată pentru a itera prin tranzacții.

  2. Găsiți următorul cod cu câteva linii înainte de începutul buclei while .

    int transactions = 10;
    
    
  3. Actualizați numărul de tranzacții astfel 40 :

    int transactions = 40;
    
    
  4. Găsiți următoarea linie de cod în while buclă.

    int itemCost = valueGenerator.Next(2, 20);
    
    
  5. Actualizați generatorul itemCost numeric aleator după cum urmează:

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

    Acest interval de costuri este o potrivire mai bună pentru articolele pe care le vor achiziționa clienții.

  6. Utilizați meniul Fișier pentru a salva actualizările.

  7. În meniul Executare , selectați Pornire depanare.

  8. Examinați ieșirea în panoul TERMINAL.

  9. Verificați dacă se afișează mesajele asociate cu cele două tipuri de excepții:

    Raportul tranzacțiilor ar trebui să includă următoarele mesaje "Nu s-a putut finaliza tranzacția":

    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.
    
    

Felicitări, ați depanat aplicația de registru de numerar pentru a remedia o problemă de logică de cod și ați actualizat aplicația pentru a utiliza tehnici adecvate de tratare a excepțiilor.

Notă

Rezultatul raportat arată că banii până nu mai sunt echilibrați. Există erori logice suplimentare în cod. Un modul de proiect de provocare este disponibil dacă vă interesează să demonstrați abilitățile de depanare Visual Studio Code!