Sunteți pe pagina 1din 14

UNIVERSITATEA DE STAT DIN MOLDOVA

FACULTATEA MATEMATIC I INFORMATIC


DEPARTAMENTUL INFORMATIC

Referat

Tema: Prelucrarea excepiilor n C#

Conductor tiinific: V. Arnaut


Elaborat: Chic Victoria Gr. BD1

Chiinu, 2016

Cuprins:
Ce este o excepie?..........................................................................................................................3
Obiectele System Exception............................................................................................................3
Metodele i proprietile clasei Exception.................................................................................4
Excepii standard derivate din System Exception......................................................................5
Blocurile Try Catch Finally......................................................................................................5
Blocul Throw..................................................................................................................................9
Blocul Finally.................................................................................................................................9
Exemple de excepii..................................................................................................................10
Concluzie.......................................................................................................................................13
Bibliografie...................................................................................................................................14

Ce este o excepie?
Atunci cand programm este aproape imposibil s nu primim erori:
-

de sintaxa (abatere de la sintaxa limbajului de programare),


de logica (greseli in logica programului),
erori la executie (exceptii).

Definiie: O excepie este un obiect care ncapsuleaz informaii despre o situaie anormal.
Excepia se folosete pentru a semnala contextul n care apare acea situaie deosebit.
O exceptie reprezinta o eroare care intervine la runtime, la momentul executiei. In C#,
exceptiile se pot trata intr-o maniera structurata si controlata, acest lucru insemanand faptul ca
programatorul nu trebuie sa mai verifice manual daca o operatie se executa sau nu cu succes.
Observaie: Nu trebuie confundat termenul de excepie cu cel de eroare sau bug.
Excepiile nu sunt concepute pentru prevenirea bug-urilor.
Chiar dac programatorul elimin toate bugurile din programul su pot aprea erori pe care el nu
le poate preveni:
-

ncercare de deschidere a unui fiier inexistent,


mpriri la zero,
etc.

n cazul n care o metod ntlnete o astfel de excepie, atunci respectiva excepie va trebui
prins n vederea tratrii (rezolvrii) ei.

Obiectele System Exception


n C# se pot arunca ca excepii obiecte de tip System.Exception (Fig.1) sau derivate ale
lui. Pe lng ierarhia de excepii pe care limbajul C# o are inclus, programatorul i poate crea
propriile sale tipuri excepie.

Fig.1 Ierarhia excepiilor

Metodele i proprietile clasei Exception.

Excepii standard derivate din System Exception.


C# definete cteva excepii standard derivate din System.Exception. Acestea sunt
generate cnd se produc erori la executia programului. Dintre acestea se pot vedea in tabelul 1.1:
Excepia
ArrayTypeMismatchException

Explicaii
Incompatibilitatea ntr tipul valorii memorate

DivideByZeroException
IndexOutOfRangeException
InvalidCastException
OutOfMemoryException

i tipul tabloului
ncercare de mprire la zero
Indexul tabloului depete marginile definite
Operatorul cast incorect la execuie
Datorit memoriei insuficiente apelul lui new

OverflowException
StackOverflowException

eueaz
Depire aritmetic
Depirea capacitilor(definite) stivei

Tabelul 1.1 Excepiile standart derivate din System Exception.


Observaie: Este posibil definirea de ctre programator a propriilor clase de excepii. Acestea
vor fi derivate din ApplicationException.

Blocurile Try Catch Finally


Cuvintele cheie in C# rezervate pentru tratarea exceptiilor sunt try, catch, finally, throw.
Acestea reprezinta un sistem unitar, utilizarea unuia dintre ele implicand si utilizarea altuia.
n scrierea codului, programatorul va separa acele instruciuni care sunt sigure (adic nu
pot fi generatoare de excepii), de cele care sunt susceptibile s conduc la erori.
Intr-un bloc try vom scrie instructiunile care trebuie verificate pentru aparitia erorilor. Daca pe
parcursul executiei acestor intructiuni apare o exceptie, aceasta este aruncata, lansata (thrown),
iar partea corespunztoare tratrii excepiei, ntr-un bloc catch.
Cu ajutorul lui catch programul poate intercepta exceptia si o poate trata in functie de
logica programului. Instructiunile din catch se executa doar daca se lanseaza o exceptie.
n cazul n care blocul try genereaz o excepie, Runtime ntrerupe execuia i caut un bloc
catch apropiat care, n funcie de tipul su s poat trata respectiva eroare. n cazul n care este
gsit respectivul bloc catch programul continu cu instruciunile din corpul catch. n cazul n
care nu se gsete nici un catch corespunztor, execuia programului este ntrerupt. Avnd n
5

vedere c ntr-un corp try pot s apar excepii diferite, n program pot exista mai multe blocuri
corespunztoare catch.
Instructiunile din finally se vor executa intotdeauna.
Mai jos putei vedea o schema conceptuala a codului folosit pentru tratarea excepiilor.

Cuvantul cheie try nu poate aparea fara a fi completat de cuvantul cheie catch sau de finally si
nici invers. Finally este optional.
Exemplu:
Se citete de la tastatur 2(dou) numere i se impart. n cazul n care de la tastatura se introduce
greit de exemplu: litere n loc de numere. Excepiile vor fi prinse i tratate .
n cazul n care al doilea numar este zero la fel va fi tratat excepia, deoarece nu po i mpr i la
zero.

Observaie: Pentru a intercepta orice excepii, indiferent de tipul lor se va folosi catch fr
parametru. Prin aceasta se va crea o rutin care va intercepta i trata toate excepiile.
Un exemplu simplu de tratare a exceptiei DivideByZeroException si de folosire a
blocului try catch finally:

Se adaug instructiunile pentru blocurile catch cat mai specifice, inainte celor generale.
CLR cauta instructiunea catch care va trata exceptia. Daca metoda curenta in care ne aflam cu
debug-erul nu contine un bloc catch, atunci CLR va cauta in metoda care a apelat metoda
curenta, si asa mai departe conform call stack. Daca nu este gasit nici un catch, atunci CLR va
afisa un mesaj cum ca exceptia nu este tratata, unhandled exception message, apoi va opri
executia programului.
In general, instructiunea catch nu are un parametru. Totusi, il putem adauga in cazul in
care vom avea nevoie de accesul la obiectul care reprezinta exceptia. Este folositor pentru
furnizarea informatiilor suplimentare despre eroarea produsa.
catch (Exception exception)
{
Console.WriteLine(exception.Message);
Console.WriteLine(exception.GetType());
}

Fluxul executiei programului continua cu instructiunile aflate dupa blocul catch.


8

Blocul Throw
Instruciunea throw programatorul poate s-i compun modaliti proprii de aruncare a
erorilor folosind instruciunea throw:
Throw new NumeExceptie (exceptie);
unde:
NumeExceptie trebuie s fie numele unei clase apropiate de excepia avut n vedere,
excepie este un mesaj care apare n cazul n care apare excepia, iar aceasta nu este prins cu
catch.

Blocul Finally
Instructiunile dintr-un bloc finally se executa intotdeauna, chiar daca o exceptie este
prinsa sau nu. Acest bloc este folosit pentru a curata resursele folosite intr-un bloc trysi pentru
a asigura executarea unor instructiuni de cod indiferent de modul in care se iese din blocul
precedent de try.

Exemple de excepii.
a.

n exemplu de mai jos sunt tratate dou excepii care pot aprea la incercarea de

converti un string la ntreg. Prima excepie trateaz cazul n care numrul convertit este prea
mare i nu poate fi memorat ntr-un ntreg (OverflowException). A doua excepie poate s apar
dac datele convertite nu sunt numerice (FormatException). n cazul n care conversia nu a avut
loc, valoarea afiat va fi 0.
int n = 0;
string s;
Console.Write("n = ");
s = Console.ReadLine();
try
{
n = int.Parse(s);
}
catch (OverflowException)
{
Console.WriteLine("Numarul citit este prea mare");
}
catch (FormatException)
{
Console.WriteLine("Datele citite nu sunt numerice");
}
finally
{
Console.WriteLine(n);
}

b. Urmtorul exemplu determin restul mpririi a dou numere naturale. Dac mpritorul
este 0, atunci va fi aruncat o excepie: DivideByZeroException.
static void Main(string[] args)
{
int a, b, r = -1;
10

a = int.Parse(Console.ReadLine());
b = int.Parse(Console.ReadLine());
Console.Write("Restul impartirii lui {0} la {1} : ", a, b);
try
{
r = a % b;
}
catch (DivideByZeroException)
{
Console.WriteLine("Eroare. Impartire prin zero!");
}
finally
{
if (r >= 0) Console.WriteLine(r);
}
}
c. Exemplul de mai jos va trata o alt excepie, anume cnd ncercm s citim dintr-un fiier
text care nu exist.
static void Main(string[] args)
{
StreamReader fin;
try
{
fin = new StreamReader("date.txt");
}
catch (FileNotFoundException)
{
Console.WriteLine("Fisierul nu exista!");
}
}
d. Un ultim exemplu trateaz situaia n care se depesc limitele unui vector, adic
ncercm s accesm o component inexistent.

11

int[] t = { 1, 6, 2, 8, 3, 6, 5 };
int i, s = 0;
try
{
for (i = 0; i < 8; i++)
s += t[i];
}
catch (IndexOutOfRangeException)
{
Console.WriteLine("Acces la componente din afara tabloului!");
}
finally
{
Console.WriteLine("Suma este : " + s);
}
La final, propun scrierea unor scurte secvene care trateaz urmtoarele
excepii:DirectoryNotFoundException, DriveNotFoundException, FieldAccessException,In
validCastException. Mai menionez c termenul de "cast" se refer la conversie de la un tip de
dat la altul.

12

Concluzie
Dup cum s-a putut observa in exemplele de mai sus, exceptiile sunt reprezentate prin
clase. Toate deriva din clasa de baza Exception.
Se disting doua clase prin reprezentarea a doua categorii generale de exceptii:
-

exceptii generate de motorul de executie SystemException,


exceptii generate de programele de aplicatieApplicationException.
Ele nu adauga membri noi la clasa de baza, ci doar definesc radacile celor doua ierarhii de

clase care reprezinta exceptii. De exemplu, in cazul impartirii la zero se produce o exceptie de
tipul DivideByZeroException.
Programatorul isi poate defini propriile clase care reprezinta exceptii prin derivarea
clasei ApplicationException.
Un program trebuie sa trateze exceptiile intr-o maniera logica si eleganta si sa isi continue apoi
executia. Daca programul nu intercepteaza exceptia, el va fi fortat sa se inchida.

13

Bibliografie
1. Tratarea excepiilor n C#. https://tuneam.files.wordpress.com/2015/02/poo_6_c.pdf
2. Blogul Dan Pracsiu, Lecia 7 Tratarea excepiilor
3. http://www.dponline.ro/articol.php?idarticol=101
4. Kiniry, J. R. (2006). "Exceptions in Java and Eiffel: Two Extremes in Exception Design
and Application". Advanced Topics in Exception Handling Techniques. Lecture Notes in
Computer Science. 4119. p. 288. doi:10.1007/11818502_16. ISBN 978-3-540-37443-5.

14