Exerciții - Implementați gestionarea excepțiilor de tip try-catch
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.
Deschideți o nouă instanță a Visual Studio Code.
În meniul Fișier , selectați Deschidere folder.
În caseta de dialog Deschidere folder , navigați la folderul Desktop Windows.
În caseta de dialog Deschidere folder , selectați Folder nou.
Denumiți noul folder Excepții101, apoi selectați Selectare folder.
În meniul terminal, selectați Terminal nou .
Veți utiliza o comandă .NET CLI pentru a crea o nouă aplicație consolă.
În linia de comandă din panoul TERMINAL, introduceți următoarele comenzi:
dotnet new consoleÎnchideți panoul TERMINAL.
Implementați un simplu try-catch
Utilizați vizualizarea Visual Studio Code EXPLORER pentru a deschide fișierul Program.cs.
În meniul Vizualizare, selectați Paletă de comenzi.
În linia de comandă, introduceți .net: g , apoi selectați .NET: Generare active pentru compilare și depanare.
Î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");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
doublevariabilă de tip pentru calcule atunci când sunt importante valori fracționare precise.În meniul Executare , selectați Pornire depanare.
Observați că o
DivideByZeroExceptionexcepț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
doubleeste capabilă să se finalizeze fără a cauza o eroare. Un calcul împărțire-la-zero utilizânddoublevariabile de tip returnează un rezultat egal cu infinit, -infinit sau "nu un număr". Acest lucru nu înseamnă că trebuie să utilizațidoubleîntotdeauna variabile de tip în loc deintsaudecimaltipuri. 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.Pe bara de instrumente Depanare, selectați Continuare.
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 7Observaț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
consolesăintegratedTerminalutilizați panoul TERMINAL pentru ieșirea aplicației. Mesajele de depanare se afișează întotdeauna în panoul CONSOLĂ DEBUG.Încadrați cele două calcule în blocul de cod al unei
tryinstrucț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");Observați linia roșie ondulată de sub paranteza de închidere a blocului
try.Sintaxa C# necesită o
catchclauză saufinallyatunci când utilizați otryinstrucțiune.Construiți un
catchbloc de cod sub blocul detrycod, după cum urmează:try { Console.WriteLine(float1 / float2); Console.WriteLine(number1 / number2); } catch { Console.WriteLine("An exception has been caught"); }În meniul Fișier Visual Studio Code, selectați Salvare.
În meniul Executare , selectați Pornire depanare.
Examinați rezultatul pe care l-a produs aplicația.
∞ An exception has been caught Exit programObservaț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.
Î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); }Citiți un minut pentru a revizui codul actualizat.
- Instrucțiunile de nivel superior includ blocul de
trycod care apeleazăProcess1()metoda. - Metoda
Process1()apeleazăWriteMessage()metoda. -
WriteMessage()Metoda conține codul în careDivideByZeroExceptionva 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 și
try.catch
Instrucțiunile de nivel superior sunt reprezentate ca metodă denumită
Mainîn stiva de apeluri.- Instrucțiunile de nivel superior includ blocul de
În meniul Fișier Visual Studio Code, selectați Salvare.
În meniul Executare , selectați Pornire depanare.
Examinați rezultatul pe care l-a produs aplicația.
∞ An exception has occurred Exit programObservaț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-catchmodel pentrutryliniile de cod specificate din aplicația dvs. șicatchexcepțiile care apar în domeniul bloculuitryde cod. - Utilizați o
catchclauză pentru a surprinde o excepție lansată la același nivel al stivei de apeluri. - Utilizați o
catchclauză pentru a captura o excepție lansată la un nivel mai înalt al stivei de apeluri.