Documente Academic
Documente Profesional
Documente Cultură
Cuprins
Introducere....................................................................................................3
1. Clasa Exception.......................................................................................4
2. Blocurile Try Catch Finally...............................................................8
3. Crearea propriilor excepii.....................................................................14
Concluzii.....................................................................................................17
Bibliografie.................................................................................................18
Introducere
C#, la fel ca alte limbaje de programare permite tratarea erorilor i a situa iilor deosebite prin
excepii. Adic gestiunea situaiilor neprevzute, care apar n momentul execuiei unui program este
implementat prin intermediul excepiilor.
Prin excepie se nelege un obiect care ncapsuleaz informaii despre situaii anormale n
funcionarea unui program. Excepia se folosete pentru a semnala contextul n care apare o situaie
special.
Un lucru foarte important la crearea unei aplicaii este ca aceasta s nu conin erori, precum i
ca produsul final s conin mesaje de eroare adresate utilizatorului n cazul n care sunt introduse
date eronate.
Apariia unei erori poate fi cauzat de mai muli factori, pentru a afla cauza precis a acesteia,
se utilizeaz excepiile.
Excepiile permit gestiunea erorilor de sistem i a erorilor definite de programator.
O excepie reprezint o eroare care intervine la momentul execuiei unu program. n C#
excepiie se pot trata ntr-o manier controlat, acest lucru msemnnd faptul c programatorul nu
trebuie s mai verifice manual dac o operaiune se execut sau nu cu succes.
C# definete excepii standard pentru tipuri de erori obinuite dintr-un program (mpr irea la
zero, memorie insuficient, depirea capacitii unui vector).
Se disting doua clase prin reprezentarea a doua categorii generale de excepii: exceptii
generate de motorul de execuie SystemException si excepii generate de programele de aplicatie
ApplicationException. Ele nu adaug membri noi la clasa de baza, ci doar definesc rdcile celor
doua ierarhii de clase care reprezint excepii. Programatorul ii poate defini propriile clase care
reprezinta exceptii prin derivarea clasei ApplicationException.
Clasa SystemException i derivate ale acesteia, servesc la tratarea adecvat i diversificat a
excepiilor.
1. Clasa Exception
Tratarea excepiilor ofer un mecanism pentru semnalarea condiiilor excepionale care pot
aprea n timpul execuiei programului.
Excepiile sunt de fapt obiecte derivate din System.Exception care conine informaii despre
tipul erorii i locul unde a aprut. Se pot folosi excep ii predefinite, dar se pot crea i excep ii noi
prin definirea unei clase derivate din System.Exception. Exist o ierarhie de excepii care se pot
folosi, sau se pot crea propriile tipuri excepii.
Constructorii clasei Exception:
eroare specificat;
Exception(String,Exception) - iniializeaz o nou instan a clasei Exception cu un
mesaj de eroare specificat i o referire la excepia interioar, care este cauza exceptiei,
preia un obiect de tip Exception (sau de tip clas derivat) care va fi ncapsulat n
instana curent, astfel, o excepie poate s conin n interiorul sau o instan a altei
excepii.
public virtual IDictionary Data { get; } - o colectie de valori care furnizeaza informaii
suplimentare despre excepie, definite de utilizator. Un obiect ce implementeaz
interfaa System.Collections.IDictionary i conine o colecie de perechi chei / valoare
public virtual string Source {get; set;} - obine sau seteaz numele aplicaiei sau al
StreamingContext context).
GetType()- obine tipul de rulare a instanei curente, sintaxa: public Type GetType().
MemberwiseClone() - creeaz o copie superficial a obiectului curent, sintaxa:
Cnd este necesar de a se arunca, lansa o excepie, este posibilitatea de a se utiliza unul sau
mai mlte tipuri de excepii existente in .Net.
Tipuri de excepii si condiiile cnd pot fi lansate:
ArgumentException - exceptia este lansat cnd unul din argumentele transmis metodei
este invalid, sintaxa:
[SerializableAttribute]
[ComVisibleAttribute(true)]
public class ArgumentException : SystemException, ISerializable
FormatException - Excepia este lansat, atunci cnd formatul unui argument este
invalid (Exemplul 1), sintaxa:
[SerializableAttribute]
[ComVisibleAttribute(true)]
public class FormatException : SystemException
PathTooLongException - Excepia este lansat, atunci cnd un fiier este mai mare
dect lungimea maxim definit de sistem, sintaxa:
[SerializableAttribute]
[ComVisibleAttribute(true)]
public class PathTooLongException : IOException
TimeoutException - Excepia este lansat, atunci cnd timpul alocat pentru un proces
sau o operaiune a expirat, sintaxa:
[SerializableAttribute]
[ComVisibleAttribute(true)]
public class TimeoutException : SystemException
Rezultatele execuiei programului n cazul n care conversia a avut loc (Img. 1):
Cazul n care numarul convertit este prea mare i nu poate fi memorat ntr-un ntreg, este trat
prin intermediul excepiei OverflowException (Img. 2):
Cazul n care elementul convertit nu este numeric, este trat prin intermediul excep iei
FormatException (Img. 3):
10
CLR1 va cuta instruciunea catch care va trata excepia. Daca nu este gasit nici un catch,
atunci CLR va afisa un mesaj cum ca excepia nu este tratat, unhandled exception message, apoi va
opri execuia programului (Exemplul 2).
Exemplul 2: Lipsesc blocurile catch.
static void Main(string[] args)
{
int n = 0;
string s;
Console.Write("n = ");
s = Console.ReadLine();
try
{
n = int.Parse(s);
}
finally
{
Console.WriteLine(n);
}
Console.ReadLine();
}
1 Common Language Runtime (CLR) este un mediu de executie reuit, care este parte a cadrului
Microsoft .Net. CLR gestioneaz executarea programelor scrise n diferite limbaje suportate.
11
Excepiile necesit tratare diferit n funie de tipul lor. Este important de a se oferi mai multe
blocuri catch, coninnd cod de tratare pentru fiecare tip de eroare n parte
Instruciunile dintr-un bloc finally se execut intotdeauna, chiar dac o excepie este prinsa sau
nu. Acest bloc este folosit pentru a curaa resursele folosite ntr-un bloc try si pentru a asigura
executarea unor instruciuni de cod indiferent de modul n care se iese din blocul precedent de try.
Blocul try nu poate fi prezent fr blocul catch sau finally i nici invers. Blocul finally este
obional.
try
{
//in acest bloc exceptia este "aruncata"
}
catch
{
//in acest bloc exceptia este "prinsa"
}
finally
{
//codul de curatare, optional
}
daca nu a aprut nici o exepie sau dac excepia a fost tratat printr-un bloc catch execuia
continu cu instruciunile de dup blocul finally, altfel excepia este propagat n apelator.
Blocurile try catch finally pot fi incluse n alte blocuri try.
Exemplul 3: Determinarea restului mpririi a dou numere
Condul programului:
static void Main(string[] args)
{
int a, b, r=0;
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
{
Console.WriteLine(r);
}
Console.ReadLine();
}
n exemplul dat, se observ c atunci cnd mpritorul este 0 (zero), atunci este aruncat o
exepie: DivideByZeroException.
14
set
{
// validare varsta
if (value < 0 || value > 200)
throw new VarstaInvalida(value);
varsta = value;
}
}
string nume;
int varsta;
}
class Program
{
static void Main()
{
// creare obiect
Persoana ionel = new Persoana("Ion", 20);
try
{
Console.Write("Varsta noua:");
ionel.Varsta = int.Parse(Console.ReadLine());
Console.WriteLine("Varsta noua este {0}.", ionel.Varsta);
}
catch (FormatException)
{
Console.WriteLine("Eroare: Varsta trebuie sa fie un intreg.");
}
catch (VarstaInvalida e)
{
Console.WriteLine("Eroare: Varsta trebuie sa fie intre 0 si 200.");
Console.WriteLine(e.Message);
}
finally
{
Console.WriteLine("{0} are {1} ani.", ionel.Nume, ionel.Varsta);
}
Console.ReadLine();
}
}
n exemplul dat, prin blocul try se ncearc s se citeasc vrsta de la tastatur, excepiile care
pot aprea sunt:
FormatException irul nu poate fi convertit la un ntreg;
VarstaInvalida vrsta nu este valid.
Rezultatele executiei programului:
16
La setarea vrstei invalide (Img.8) este aruncat excepia VarstaInvalida, care anun c a
aprut o excepie prin intermediul mesajului Varsta trebuie sa fie intre 0 si 200, precum i mesajul
excepiei -22 nu este o valoare valida pentru varsta, prin intermediul instanei de eroare e.
La ncercarea de a se seta vrstei o valoare ce nu este de tip ntreg, este aruncat excep ia
FormatException, ce anun c valoarea setat nu poate fi convertit n ntreg (Img.9)
Mesajul din blocul finally se va afia indiferent de ce se ntmpl n blucl try, dac apare o
eroare, atunci vrsta afiat, va fi vrsta setat prin constructor, altfel, se va afia vrsta citit de la
tastatura. (Img. 8, Img.9).
17
Concluzii
Un programator nu trebuie s confunde tratarea excepiilor cu erorile sau bag-urile. Erorile de
run-time pot aprea pentru o varietate de motive, cu toate acestea nu toate erorile trebuie s fie
tratate ca excepii. De exemplu un bag este o eroare de programare care ar trebuie s fie fixat
naintea livrarii codului.
Excepiile nu sunt create pentru a preveni bag-urile, deoarece bag-urile trebuie s fie
eliminate, cu toate c un bag poate s duc la apariia unei excepii. La fel sunt i erorile de utilizare,
adic o eroare n logica de program, care poate duce la o excepie. Cu toate acestea, eroarea ar trebui
s fie abordat nu prin tratarea exceptiilor, ci prin modificarea codului defect.
Excepiile sunt situaiile neasteptate aparute n cadrul sistemului care ruleaza un program.
Programele trebuie s fie pregatite pentru a trata aceste situatii excepionale.
Tratarea excepiilor are ca avantaj evitarea nchiderii anormale a programului. Cand o excepie
va fi aruncat, ea va fi prins undeva, n cod. Dac programul nu va prinde excepia, ea va fi
manipulat de runtime, care o va transforma n eroare i va nchide programul.
18
Bibliografie
1. Rodica Pintea, Adrian Ni, Nicolae Olroiu, Mihai Ttran, Tudor-Ioan Salomie
2.
3.
4.
5.
6.
7.
8.
19