Exerciții - Implementați gestionarea excepțiilor de tip try-catch

Finalizat

Modelul try-catch constă dintr-un try bloc urmat de una sau mai catch multe propoziții. Fiecare catch clauză specifică rutina de tratare pentru un alt tip de excepție.

Atunci când se lansează o excepție, modulul runtime lingvistic comun (CLR) caută o catch clauză care poate gestiona excepția. Dacă metoda de execuție curentă nu conține o catch clauză care poate gestiona tipul de excepție lansat, CLR caută metoda care a numit metoda curentă. Căutarea continuă în jos prin stiva de apeluri până când se găsește o clauză potrivită catch . Dacă nu se găsește nicio catch clauză pentru a gestiona excepția, CLR afișează un mesaj de excepție netratat utilizatorului și oprește executarea programului.

În acest exercițiu, veți implementa un model de bază try-catch .

Creați un proiect de cod nou

Primul pas este să creați un proiect de cod pe care îl utilizați î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 Excepții101, 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ătoarele comenzi:

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

Implementați un simplu try-catch

  1. Utilizați vizualizarea Visual Studio Code EXPLORER pentru a deschide 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:

    double float1 = 3000.0;
    double float2 = 0.0;
    int number1 = 3000;
    int number2 = 0;
    
    Console.WriteLine(float1 / float2);
    Console.WriteLine(number1 / number2);
    Console.WriteLine("Exit program");
    
  5. Luați un minut pentru a examina codul.

    Observați că aplicația utilizează două tipuri de variabile numerice și doubleint. Codul efectuează un calcul de împărțire utilizând ambele tipuri numerice.

    Dezvoltatorii utilizează o double variabilă de tip pentru calcule atunci când sunt importante valori fracționare precise.

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

    Observați că o DivideByZeroException excepție apare atunci când împărțiți valorile întregi.

    Notă

    Este posibil să fi observat că ecuația utilizând variabile de tip double este capabilă să se finalizeze fără a cauza o eroare. Un calcul împărțire-la-zero utilizând double variabile de tip returnează un rezultat egal cu infinit, -infinit sau "nu un număr". Acest lucru nu înseamnă că trebuie să utilizați double întotdeauna variabile de tip în loc de int sau decimal tipuri. Abordarea corectă este să utilizați variabile de tipul corespunzător și să implementați gestionarea excepțiilor pentru a capta orice erori care pot apărea.

  7. Pe bara de instrumente Depanare, selectați Continuare.

    Captură de ecran afișând butonul Continuare pe bara de instrumente Depanare.

  8. Așteptați un minut pentru a examina ieșirea mesajului pentru aplicația dvs.

    ∞
    Unhandled exception. System.DivideByZeroException: Attempted to divide by zero.
       at Program.<Main>$(String[] args) in C:\Users\msuser\Desktop\Exceptions101\Program.cs:line 7
    

    Observați că excepția netratată a făcut ca aplicația dvs. să se închidă după finalizarea primei Console.WriteLine() instrucțiuni.

    Notă

    În mod implicit, Visual Studio Code utilizează un text de culoare diferit pentru a afișa mesajele generate de depanator. Acest lucru ajută dezvoltatorul să facă diferența între rezultatele aplicației și mesajele de depanare. Dacă doriți o vizualizare mai curată a ieșirii aplicației, puteți configura fișierul launch.json pentru a utiliza o altă consolă. De exemplu, setați consoleintegratedTerminal utilizați panoul TERMINAL pentru ieșirea aplicației. Mesajele de depanare se afișează întotdeauna în panoul CONSOLĂ DEBUG.

  9. Încadrați cele două calcule în blocul de cod al unei try instrucțiuni după cum urmează:

    double float1 = 3000.0;
    double float2 = 0.0;
    int number1 = 3000;
    int number2 = 0;
    
    try
    {
        Console.WriteLine(float1 / float2);
        Console.WriteLine(number1 / number2);
    }
    
    Console.WriteLine("Exit program");
    
  10. Observați linia roșie ondulată de sub paranteza de închidere a blocului try .

    Sintaxa C# necesită o catch clauză sau finally atunci când utilizați o try instrucțiune.

  11. Construiți un catch bloc de cod sub blocul de try cod, după cum urmează:

    try
    {
        Console.WriteLine(float1 / float2);
        Console.WriteLine(number1 / number2);
    }
    catch
    {
        Console.WriteLine("An exception has been caught");
    }
    
  12. În meniul Fișier Visual Studio Code, selectați Salvare.

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

  14. Examinați rezultatul pe care l-a produs aplicația.

    ∞
    An exception has been caught
    Exit program
    
  15. Observați că, deși excepția încă apare, aplicația dvs. poate termina de executat liniile de cod rămase înainte de închidere.

    Gestionarea excepțiilor vă permite să controlați executarea codului atunci când apar excepții. Gestionarea excepțiilor vă ajută să vă asigurați că codul este stabil și produce rezultatele așteptate.

Excepții de captură lansate în metodele denumite

În multe cazuri, o excepție este prinsă la un nivel al stivei de apeluri care se află sub nivelul în care a fost lansată.

Atunci când este lansată o excepție și metoda curentă nu captează excepția, timpul de rulare comun al limbii va derula stiva, căutând o metodă care conține o catch clauză care poate gestiona excepția. Prima catch clauză a găsit că poate gestiona excepția va fi executată. Dacă nu se găsește nicio clauză corespunzătoare catch oriunde în stiva de apeluri, modulul runtime de limbă comună va închide procesul și va afișa un mesaj de eroare utilizatorului.

  1. Înlocuiți codul din fișierul Program.cs cu următorul cod:

    try
    {
        Process1();
    }
    catch
    {
        Console.WriteLine("An exception has occurred");
    }
    
    Console.WriteLine("Exit program");
    
    static void Process1()
    {
        WriteMessage();
    }
    
    static void WriteMessage()
    {
        double float1 = 3000.0;
        double float2 = 0.0;
        int number1 = 3000;
        int number2 = 0;
    
        Console.WriteLine(float1 / float2);
        Console.WriteLine(number1 / number2);
    }
    
  2. Citiți un minut pentru a revizui codul actualizat.

    • Instrucțiunile de nivel superior includ blocul de try cod care apelează Process1() metoda.
    • Metoda Process1() apelează WriteMessage() metoda.
    • WriteMessage() Metoda conține codul în care DivideByZeroException va fi lansată excepția.

    Observați că excepția va fi generată într-o metodă care are două niveluri ale stivei de apeluri deasupra blocurilor de cod șitry.catch

    Captură de ecran afișând nivelurile stivei de apeluri între locul în care este lansată o excepție și locul în care este capturată.

    Instrucțiunile de nivel superior sunt reprezentate ca metodă denumită Main în stiva de apeluri.

  3. În meniul Fișier Visual Studio Code, selectați Salvare.

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

  5. Examinați rezultatul pe care l-a produs aplicația.

    ∞
    An exception has occurred
    Exit program
    
  6. Observați că, chiar dacă s-a produs o excepție de două niveluri în stiva de apeluri, aceasta este gestionată totuși cu succes.

Recapitula

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

  • Implementați un try-catch model pentru try liniile de cod specificate din aplicația dvs. și catch excepțiile care apar în domeniul blocului try de cod.
  • Utilizați o catch clauză pentru a surprinde o excepție lansată la același nivel al stivei de apeluri.
  • Utilizați o catch clauză pentru a captura o excepție lansată la un nivel mai înalt al stivei de apeluri.