Exerciții - Aruncați și surprindeți excepții într-o aplicație consolă C#
Î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:
- Actualizați instrucțiunile de nivel superior: Implementați un
try-catchmodel în instrucțiunile de nivel superior. Blocultryde cod va conține apelul cătreMakeChange. - Metoda de actualizare
MakeChange: Creați și generați excepții pentru problemele "Insuficientă până" și "Subplată". - Actualizați blocul de
catchcod pentru a utiliza proprietățile excepției lansate. - 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 .
Asigurați-vă că fișierul Program.cs este deschis în Visual Studio Code Editor.
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}"); }Luați un minut pentru a lua în considerare scopul acestui cod.
Observați că
MakeChangereturnează o valoare șir. Valoarea returnată este atribuită unei variabile denumitetransactionMessage. DacătransactionMessageeste egal cu "tranzacție reușită", atunci costul articolului achiziționat este adăugat laregisterCheckTillTotal. VariabilaregisterCheckTillTotaleste utilizată pentru a verifica soldul până la calculul metodeiMakeChange.Pentru a încadra apelul la metoda dintr-un
MakeChangebloc detrycod 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); }Adăugați următoarea
catchclauză după blocul codului detryinstrucțiune:catch { }Veți termina de dezvoltat
catchclauza 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ă,
MakeChangear 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,
MakeChangear trebui să arunce și excepție.
Defilați în jos la metoda
MakeChange.Găsiți următoarele linii de cod:
if (changeNeeded < 0) transactionMessage = "Not enough money provided.";Aveți nevoie de un minut pentru a lua în considerare problema pe care o abordează acest cod.
Dacă
changeNeededeste 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 metodeiMakeChange. 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ă oInvalidOperationExceptionexcepț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- OArgumentOutOfRangeExceptionexcepț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
InvalidOperationExceptioneste o potrivire ușor mai bună în contextul acestei aplicații.-
Actualizați codul după cum urmează:
if (changeNeeded < 0) throw new InvalidOperationException("InvalidOperationException: Not enough money provided to complete the transaction.");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?";Aveți nevoie de un minut pentru a lua în considerare problema pe care o abordează acest cod.
Dacă
changeNeededeste mai mare decât zero dupăwhilebuclele 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
InvalidOperationExceptionar trebui utilizată pentru a crea excepția.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.
Defilați în sus deasupra metodei
MakeChangeși găsiți următorul cod:catch { }Pentru a surprinde tipul de excepție lansat în
MakeChangemetodă, actualizați codul după cum urmează:catch (InvalidOperationException e) { Console.WriteLine($"Could not complete transaction: {e.Message}"); }Obiectul
InvalidOperationExceptionexcepție lansat vaMakeChangefi 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 cadrulMakeChange, puteți adăuga clauze suplimentarecatch.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.
Defilați în partea de sus a metodei
MakeChange.Pentru a efectua conversia metodei
MakeChangede la tip la tipstringvoid, actualizați codul după cum urmează:static void MakeChange(int cost, int[] cashTill, int twenties, int tens = 0, int fives = 0, int ones = 0)Ștergeți următoarea declarație de variabilă:
string transactionMessage = "";Defilați în partea de jos a metodei
MakeChange.Ștergeți următoarele linii de cod:
if (transactionMessage == "") transactionMessage = "transaction succeeded"; return transactionMessage;Defilați în sus la instrucțiunile de nivel superior și găsiți blocul de
trycod.Actualizați blocul de
trycod 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; }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
tryde cod șicatchcomunică acum mesajele de tranzacție "succes" și "nereușită" utilizatorului. Deoarece proprietatea excepțieiMessagedescrie 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.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.
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.
Găsiți următorul cod cu câteva linii înainte de începutul buclei
while.int transactions = 10;Actualizați numărul de tranzacții astfel
40:int transactions = 40;Găsiți următoarea linie de cod în
whilebuclă.int itemCost = valueGenerator.Next(2, 20);Actualizați generatorul
itemCostnumeric 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.
Utilizați meniul Fișier pentru a salva actualizările.
În meniul Executare , selectați Pornire depanare.
Examinați ieșirea în panoul TERMINAL.
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!