Exerciții - Crearea și aruncarea unei excepții

Finalizat

Dezvoltatorii trebuie adesea să creeze și să genereze excepții dintr-o metodă, apoi să prindă aceste excepții mai jos în stiva de apeluri, unde pot fi tratate. Gestionarea excepțiilor vă ajută să asigurați stabilitatea aplicațiilor.

În acest exercițiu, veți începe cu o aplicație eșantion care include o condiție de eroare potențială în interiorul unei metode denumite. Metoda actualizată va face throw excepție atunci când detectează problema. Excepția va fi gestionată într-un catch bloc al codului care apelează metoda. Rezultatul este o aplicație care oferă o experiență de utilizator mai bună.

Creați un proiect de cod nou

Primul pas este să creați un proiect de cod pe care îl puteți utiliza în timpul acestui modul.

  1. Deschideți o nouă instanță a Visual Studio Code.

  2. În meniul Fișier , selectați Deschidere folder.

  3. În caseta de dialog Deschidere folder , navigați la folderul Desktop Windows.

  4. În caseta de dialog Deschidere folder , selectați Folder nou.

  5. Denumiți noul folder ThrowExceptions101, apoi selectați Selectare folder.

  6. În meniul terminal, selectați Terminal nou .

    Veți utiliza o comandă .NET CLI pentru a crea o nouă aplicație consolă.

  7. În linia de comandă din panoul TERMINAL, introduceți următoarea comandă:

    dotnet new console
    
  8. Închideți panoul TERMINAL.

Revizuirea unei aplicații eșantion

Utilizați pașii următori pentru a încărca și a revizui o aplicație eșantion.

  1. Deschideți fișierul Program.cs.

  2. În meniul Vizualizare, selectați Paletă de comenzi.

  3. În linia de comandă, introduceți .net: g , apoi selectați .NET: Generare active pentru compilare și depanare.

  4. Înlocuiți conținutul fișierului Program.cs cu următorul cod:

    // Prompt the user for the lower and upper bounds
    Console.Write("Enter the lower bound: ");
    int lowerBound = int.Parse(Console.ReadLine());
    
    Console.Write("Enter the upper bound: ");
    int upperBound = int.Parse(Console.ReadLine());
    
    decimal averageValue = 0;
    
    // Calculate the sum of the even numbers between the bounds
    averageValue = AverageOfEvenNumbers(lowerBound, upperBound);
    
    // Display the value returned by AverageOfEvenNumbers in the console
    Console.WriteLine($"The average of even numbers between {lowerBound} and {upperBound} is {averageValue}.");
    
    // Wait for user input
    Console.ReadLine();
    
    static decimal AverageOfEvenNumbers(int lowerBound, int upperBound)
    {
        int sum = 0;
        int count = 0;
        decimal average = 0;
    
        for (int i = lowerBound; i <= upperBound; i++)
        {
            if (i % 2 == 0)
            {
                sum += i;
                count++;
            }
        }
    
        average = (decimal)sum / count;
    
        return average;
    }
    
  5. Luați un minut pentru a revizui codul.

    Observați că aplicația efectuează următoarele activități:

    1. Instrucțiunile de nivel superior utilizează Console.ReadLine() instrucțiuni pentru a obține valori pentru lowerBound și upperBound.

    2. Instrucțiunile de nivel superior trec lowerBound și upperBound ca argumente atunci când apelați AverageOfEvenNumbers metoda.

    3. Metoda AverageOfEvenNumbers efectuează următoarele activități:

      1. Declară variabile locale utilizate în calcule.
      2. Utilizează o for buclă pentru a aduna numerele par între lowerBound și upperBound. Suma este stocată în sum.
      3. Contorizează numărul de numere incluse în sumă. Contorul este stocat în count.
      4. Stochează media numerelor însumate într-o variabilă denumită average. Este returnată valoarea average .
    4. Instrucțiunile de nivel superior imprimă valoarea returnată de AverageOfEvenNumbers consolă, apoi întrerupe execuția.

Configurarea mediului de depanare

Aplicația eșantion citește intrările utilizatorului de pe consolă. Panoul CONSOLĂ DEBUG nu acceptă citirea intrărilor de pe consolă. Trebuie să actualizați fișierul launch.json înainte de a rula această aplicație în depanator.

  1. Utilizați vizualizarea EXPLORER pentru a deschide fișierul launch.json.

  2. În fișierul launch.json, actualizați atributul console după cum urmează:

    // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
    "console":"integratedTerminal",
    

    Valoarea implicită pentru console atribut este internalConsole, care se aliniază la panoul CONSOLĂ DEBUG. Din păcate, panoul CONSOLĂ DEBUG nu acceptă intrările consolei. integratedTerminal Setarea se aliniază la panoul TERMINAL, care acceptă intrarea și ieșirea consolei.

  3. Salvați modificările în fișierul launch.json, apoi închideți fișierul.

  4. În meniul Rulare cod Visual Studio, selectați Pornire depanare.

  5. Comutați la panoul TERMINAL.

  6. În solicitarea "limită inferioară", introduceți 3

  7. În solicitarea "limită superioară", introduceți 11

  8. Observați că aplicația afișează următorul mesaj, apoi se întrerupe:

    The average of even numbers between 3 and 11 is 7.
    
  9. Pentru a ieși din aplicație, apăsați pe Enter.

Generați o excepție în metoda AverageOfEvenNumbers

Metoda AverageOfEvenNumbers așteaptă o limită superioară mai mare decât limita inferioară. Apare o DivideByZero eroare dacă limita inferioară este mai mare sau egală cu limita superioară.

Trebuie să actualizați AverageOfEvenNumbers metoda pentru a genera o excepție atunci când limita inferioară este mai mare sau egală cu limita superioară.

  1. Luați un minut pentru a lua în considerare modul în care doriți să rezolvați problema.

    O opțiune este să încadrați calculul în interiorul unui average bloc de try cod și catch excepția DivideByZero atunci când are loc. Puteți să reintroduceți excepția și apoi să o gestionați în codul de apelare.

    O altă opțiune este să evaluați parametrii de intrare înainte de a începe calculele. Dacă lowerBound este mai mare sau egal cu upperBound, puteți genera o excepție.

    Evaluarea parametrilor și aruncarea unei excepții înainte de a începe calculele este alegerea mai bună.

  2. Luați în considerare tipul de excepție de aruncat.

    Există două tipuri de excepții care se aliniază cu problema:

    • ArgumentOutOfRangeException ArgumentOutOfRangeException- Ar trebui lansat un tip de excepție doar atunci când valoarea unui argument se află în afara intervalului permis de valori, așa cum este definit de metoda invocată. Deși AverageOfEvenNumbers nu definește explicit o zonă permisă pentru lowerBound sau upperBound, valoarea lowerBound implică intervalul permis pentru upperBound.
    • InvalidOperationException: Ar InvalidOperationException trebui lansat un tip de 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 de intrare ai metodei.

    Atunci când aveți două sau mai multe tipuri de excepții din care să alegeți, selectați tipul de excepție care se potrivește mai îndeaproape problemei. În acest caz, cele două tipuri de excepții sunt aliniate în mod egal la problemă.

    Atunci când aveți două sau mai multe tipuri de excepții aliniate la problemă în mod egal, selectați tipul de excepție cel mai restrâns. Tipul ArgumentOutOfRangeException de excepție este definit în funcție de argumentele transmise metodei. Tipul InvalidOperationException de excepție este definit în condițiile de funcționare ale metodei. În acest caz, ArgumentOutOfRangeException tipul de excepție este mai restrâns decât tipul de InvalidOperationException excepție.

    Metoda AverageOfEvenNumbers ar trebui să genereze o ArgumentOutOfRangeException excepție.

  3. În partea de sus a metodei AverageOfEvenNumbers , pentru a detecta problema legată superioară, actualizați codul după cum urmează:

    if (lowerBound >= upperBound)
    {
    
    }
    
    int sum = 0;    
    
  4. Pentru a crea și a genera o ArgumentOutOfRangeException excepție, actualizați blocul de if cod după cum urmează:

    if (lowerBound >= upperBound)
    {
        throw new ArgumentOutOfRangeException("upperBound", "ArgumentOutOfRangeException: upper bound must be greater than lower bound.");
    }
    

    Această linie de cod inițializează o nouă instanță a ArgumentOutOfRangeException clasei cu numele parametrului de intrare care provoacă excepția și un mesaj de eroare specificat.

Prindeți excepția din codul de apelare

Ori de câte ori este posibil, excepțiile ar trebui să fie prinse la nivelul stivei de apeluri, unde pot fi tratate. În această aplicație eșantion, parametrii metodei AverageOfEvenNumbers pot fi gestionați în metoda de apelare (instrucțiunile de nivel superior).

  1. Defilați în sus la instrucțiunile de nivel superior.

  2. Pentru a încadra apelul de AverageOfEvenNumbers metodă și Console.WriteLine instrucțiunea într-un try bloc de cod, actualizați codul după cum urmează:

    try
    {
        // Calculate the sum of the even numbers between the bounds
        averageValue = AverageOfEvenNumbers(lowerBound, upperBound);
    
        // Display the result to the user
        Console.WriteLine($"The average of even numbers between {lowerBound} and {upperBound} is {averageValue}.");
    }
    
  3. Pentru a crea clauza asociată catch , introduceți următorul cod:

    catch(ArgumentOutOfRangeException ex)
    {
    
    }
    
  4. Luați un minut pentru a lua în considerare modul în care puteți gestiona excepția.

    Pentru a gestiona această excepție, codul trebuie să facă următoarele:

    • Explicați problema utilizatorului.
    • Obțineți o valoare nouă pentru upperBound.
    • Apelați AverageOfEvenNumbers utilizând noul upperBound.
    • Continuați cu catch excepția dacă noul upperBound furnizat este încă mai mic sau egal cu lowerBound.

    catch Continuarea excepției necesită o buclă. Pentru că doriți să apelați AverageOfEvenNumbers metoda cel puțin o dată, trebuie utilizată o do buclă.

  5. Pentru a încadra și try a catch bloca în interiorul unei do bucle, actualizați codul după cum urmează:

    do
    {
        try
        {
            // Calculate the sum of the even numbers between the bounds
            averageValue = AverageOfEvenNumbers(lowerBound, upperBound);
    
            // Display the result to the user
            Console.WriteLine($"The average of even numbers between {lowerBound} and {upperBound} is {averageValue}.");
        }
        catch (ArgumentOutOfRangeException ex)
        {
    
        }
    }
    

    Este while necesară o expresie pentru a defini condiția de ieșire a unei do bucle. Este dificil să specificați condiția înainte de definirea conținutului blocului do de cod. Finalizarea blocului de catch cod vă va ajuta să definiți expresia while necesară.

  6. Pentru a explica problema utilizatorului și a obține o nouă upperBound, actualizați catch blocul de cod după cum urmează:

    catch (ArgumentOutOfRangeException ex)
    {
        Console.WriteLine("An error has occurred.");
        Console.WriteLine(ex.Message);
        Console.WriteLine($"The upper bound must be greater than {lowerBound}");
        Console.Write($"Enter a new upper bound: ");
        upperBound = int.Parse(Console.ReadLine());
    }
    

    Blocul de cod actualizat catch descrie problema și necesită ca utilizatorul să introducă o nouă limită superioară. Cu toate acestea, ce se întâmplă dacă utilizatorul nu are o valoare limită superioară validă de introdus? Ce se întâmplă dacă utilizatorul trebuie să iasă din buclă în loc să introducă o valoare?

  7. Pentru a-i oferi utilizatorului o opțiune de a ieși din buclă, nu de a introduce o nouă limită superioară, actualizați catch blocul de cod după cum urmează:

    catch (ArgumentOutOfRangeException ex)
    {
        Console.WriteLine("An error has occurred.");
        Console.WriteLine(ex.Message);
        Console.WriteLine($"The upper bound must be greater than {lowerBound}");
        Console.Write($"Enter a new upper bound (or enter Exit to quit): ");
        string? userResponse = Console.ReadLine();
        if (userResponse.ToLower().Contains("exit"))
        {
    
        }
        else
        {
            upperBound = int.Parse(userResponse);
        }
    }
    

    Blocul de cod actualizat catch include două căi, o cale "ieșire" și o cale "nouă legată superioară".

  8. Luați un minut pentru a lua în considerare expresia while necesară pentru do buclă.

    Dacă utilizatorul introduce "Ieșire" la solicitare, codul ar trebui să iasă din buclă. Dacă utilizatorul introduce o nouă limită superioară, bucla ar trebui să continue. Se while poate utiliza o expresie care evaluează o valoare booleană. De exemplu:

    while (exit == false);
    

    Expresia propusă while va stabili următorul comportament:

    • bucla do va continua să se itereze atât timp cât Boolean exit este egal cu false.
    • bucla do va opri iterarea de îndată ce Boolean exit este egal cu true.
  9. Pentru a instanția o variabilă booleană denumită exitși pentru exit a seta condiția de ieșire a do buclei, actualizați codul după cum urmează:

    bool exit = false;
    
    do
    {
        try
        {
            // Calculate the sum of the even numbers between the bounds
            averageValue = AverageOfEvenNumbers(lowerBound, upperBound);
    
            // Display the result to the user
            Console.WriteLine($"The average of even numbers between {lowerBound} and {upperBound} is {averageValue}.");
    
            exit = true;
        }
        catch (ArgumentOutOfRangeException ex)
        {
            Console.WriteLine("An error has occurred.");
            Console.WriteLine(ex.Message);
            Console.WriteLine($"The upper bound must be greater than {lowerBound}");
            Console.Write($"Enter a new upper bound (or enter Exit to quit): ");
            string? userResponse = Console.ReadLine();
            if (userResponse.ToLower().Contains("exit"))
            {
                exit = true;
            }
            else
            {
                exit = false;
                upperBound = int.Parse(userResponse);
            }
        }    
    } while (exit == false);
    
  10. Salvați codul actualizat.

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

  12. Comutați la panoul TERMINAL.

  13. În solicitarea "limită inferioară", introduceți 3

  14. În solicitarea "limită superioară", introduceți 3

  15. Observați că următoarea ieșire este afișată în panoul TERMINAL:

    Enter the lower bound: 3
    Enter the upper bound: 3
    An error has occurred.
    ArgumentOutOfRangeException: upper bound must be greater than lower bound. (Parameter 'upperBound')
    The upper bound must be greater than 3
    Enter a new upper bound (or enter Exit to quit):
    
  16. La solicitarea pentru o nouă limită superioară, introduceți 11

  17. Observați că următoarea ieșire este afișată în panoul TERMINAL:

    Enter the lower bound: 3
    Enter the upper bound: 3
    An error has occurred.
    ArgumentOutOfRangeException: upper bound must be greater than lower bound. (Parameter 'upperBound')
    The upper bound must be greater than 3
    Enter a new upper bound (or enter Exit to quit): 11
    The average of even numbers between 3 and 11 is 7.
    
  18. Pentru a ieși din aplicație, apăsați pe Enter.

Felicitări! Ați lansat, ați prins și ați tratat cu succes o excepție.

Recapitulare

Iată câteva lucruri importante de reținut din această unitate:

  • Asigurați-vă că mediul de depanare este configurat pentru a accepta cerințele aplicației.
  • Codul de metodă ar trebui să genereze o excepție atunci când este detectată o problemă sau o condiție.
  • Excepțiile ar trebui să fie capturate la un nivel din stiva de apeluri, unde pot fi rezolvate.