Tratarea deșeurilor municipale mixte, neseparate, în așa ...
Tratarea Excepțiilor În C#
-
Upload
ariadna-ciuperca -
Category
Documents
-
view
242 -
download
0
Transcript of Tratarea Excepțiilor În C#
-
8/19/2019 Tratarea Excepțiilor În C#
1/19
Tratarea excep iilor în C#ț
-
8/19/2019 Tratarea Excepțiilor În C#
2/19
Cuprins
Introducere....................................................................................................3
1. Clasa Exception.......................................................................................4
2. Blocurile Try – Catch – Finally...............................................................8
3. Crearea propriilor excep iiț .....................................................................14
Concluzii.....................................................................................................1
Bi!lio"ra#ie.................................................................................................18
2
-
8/19/2019 Tratarea Excepțiilor În C#
3/19
Introducere
C$% la #el ca alte li&!a'e de pro"ra&are per&ite tratarea erorilor i a situa iilor deose!ite prinș ț
excep ii. (dic) "estiunea situa iilor nepre*)zute% care apar +n &o&entul execu iei unui pro"ra& esteț ț ț
i&ple&entat) prin inter&ediul excep iilor.ț
,rin excep ie se +n ele"e un o!iect care +ncapsuleaz) in#or&a ii despre situa ii anor&ale +nț ț ț ț
#unc ionarea unui pro"ra&. Excep ia se #olose te pentru a se&nala contextul +n care apare o situa ieț ț ș ț
special).
-n lucru #oarte i&portant la crearea unei aplica ii este ca aceasta s) nu con in) erori% precu& iț ț ș
ca produsul #inal s) con in) &esa'e de eroare adresate utilizatorului +n cazul +n care sunt introduseț
date eronate.
(pari ia unei erori poate #i cauzat) de &ai &ul i #actori% pentru a a#la cauza precis) a acesteia%ț ț
se utilizeaz) excep iile.ț
Excep iile per&it "estiunea erorilor de siste& i a erorilor de#inite de pro"ra&ator.ț ș
excep ie reprezint) o eroare care inter*ine la &o&entul execu iei unu pro"ra&. /n C$ț ț
excep iie se pot trata +ntr0o &anier) controlat)% acest lucru +&se&n+nd #aptul c) pro"ra&atorul nuț
tre!uie s) &ai *eri#ice &anual dac) o opera iune se execut) sau nu cu succes.ț
C$ de#ine te excep ii standard pentru tipuri de erori o!i nuite dintr0un pro"ra& +&p)r irea laș ț ș ț
zero% &e&orie insu#icient)% dep) irea capacit) ii unui *ector.ș ț
e distin" doua clase prin reprezentarea a doua cate"orii "enerale de excep ii exceptiiț
"enerate de &otorul de execu ieț SystemException si excep ii "enerate de pro"ra&ele de aplicatieț
ApplicationException. Ele nu adau") &e&!ri noi la clasa de !aza% ci doar de#inesc r)d)cile celor
doua ierarhii de clase care reprezint) excep ii. ,ro"ra&atorul i i poate de#ini propriile clase careț ș
reprezinta exceptii prin deri*area clasei ApplicationException.
Clasa SystemException i deri*ate ale acesteia% ser*esc la tratarea adec*at) i di*ersi#icat) aș ș
excep iilor.ț
3
-
8/19/2019 Tratarea Excepțiilor În C#
4/19
1. Clasa Exception
Tratarea excep iilor o#er) un &ecanis& pentru se&nalarea condi iilor excep ionale care potț ț ț
ap)rea +n ti&pul execu iei pro"ra&ului.ț
Excep iile sunt de #apt o!iecte deri*ate dinț System.Exception care con ine in#or&a ii despreț ț
tipul erorii i locul unde a ap)rut. e pot #olosi excep ii prede#inite% dar se pot crea i excep ii noiș ț ș ț
prin de#inirea unei clase deri*ate din System.Exception. Exist) o ierarhie de excep ii care se potț
#olosi% sau se pot crea propriile tipuri excep ii.ț
Constructorii clasei Exception:
• Exception() 0 ini ializeaz) o nou) instan ) a clasei Exception5ț ț• Exception(SerializationInfo, StreamingContext) 0 ini ializeaz) o nou) instan ) a claseiț ț
Exception cu datele serializate5• Exception(String) 0 ini ializeaz) o nou) instan ) a claseiț ț Exception cu un &esa' de
eroare speci#icat5• Exception(String, Exception) 0 ini ializeaz) o nou) instan ) a claseiț ț Exception cu un
&esa' de eroare speci#icat i o re#erire la excep ia interioar)% care este cauza exceptiei%ș ț
preia un o!iect de tip Exception sau de tip clas) deri*at) care *a #i +ncapsulat +n
instan a curent)% ast#el% o excep ie poate s) con in) +n interiorul sau o instan ) a alteiț ț ț ț
excep ii.ț
Proprietă ile claseiț Exception:
• public virtual IDictionary Data get! " # o colectie de *alori care #urnizeaza in#or&a iiț
supli&entare despre excep ie% de#inite de utilizator. -n o!iect ce i&ple&enteaz)ț
inter#a aț System.Collections.IDictionary i con ine o colec ie de perechi chei 6 *aloareș ț ț
de#inite de utilizator. 7aloarea i&plicit) este o colec ie "oal).ț• public virtual string $elp%in& get! set!9 – o! ine sau seteaz) un lin: c)tre un #i ier ț ș
help asociat acestei excep ii5 poate #i de ase&enea o adres) ;EB -
-
8/19/2019 Tratarea Excepțiilor În C#
5/19
• public virtual string Source get! set!9 0 o! ine sau seteaz) nu&ele aplica iei sau alț ț
o!iectului care a cauzat eroarea.• public virtual string Stac&*race get!9 – o! ine o reprezentare strin" a apelurilor deț
&etode care au dus la apari ia acestei excep ii.ț ț• public et+oase *argetSite get!9 – o! ine &etoda care a aruncat excep ia curent).ț ț
et+oase este o clas) care pune la dispozi ie in#or&a ii despre &etodele iț ț ș
constructorii unei clase.
Metodele clasei Exception:
• E-uals(b/ect) 0 >eter&ina daca o!iectul speci#icat este e"al cu o!iectul curent%
sintaxa public virtual bool E-uals(ob/ect ob/). 7a a*ea *aloarea true daca o!iectul
speci#icat este e"al cu o!iectul curent% +n caz contrar% false.• 0inalize() # &etoda de #inalizare este utilizat) pentru a e#ectua opera iuni de cur) are peț ț
resurse ne"estionate% de inute de o!iectul curent% +nainte ca o!iectul sa #ie distrus.ț?etoda este prote'at) i prin ur&are este accesi!il) doar prin aceasta clas) sau printr0oș
clas) deri*at)% sintaxa protecte virtual voi 0inalize().• 1etaseException 0 +n cazul +n care proprietatea InnerException a excep iei curenteț
este o re#erin ) nula @i&ic +n 7isual Basic% acest) proprietate +ntoarce excep iaț ț
curent)% sintaxa public virtual Exception 1etaseException().• 1et$as+Coe() 0 un cod hash este o *aloare nu&eric) care este #olosit) pentru a
introduce i a identi#ica un o!iect +ntr0o colec ie pe !az) de hash cu& ar #i clasaș ț
Aashta!le% sau un tip deri*at din clasa >ictionaryBase. ?etoda 1et$as+Coe pre*edeacest cod hash pentru al"orit&i care au ne*oie de controale rapide de e"alitate o!iect%
sintaxa public virtual int 1et$as+Coe().• 1etb/ectData(SerializationInfo, StreamingContext) 1etb/ectData 0 sta!ile te unș
SerializationInfo cu toate datele o!iectului excep iei% *izate pentru serializare% sintaxaț
2SecurityCriticalAttribute3 public virtual voi 1etb/ectData(SerializationInfo info,
StreamingContext context).
• 1et*ype()# o! ine tipul de rulare a instan ei curente% sintaxaț ț public *ype 1et*ype().•
ember4iseClone() 0 creeaz) o copie super#icial) a o!iectului curent% sintaxa protecte ob/ect ember4iseClone().
• *oString() # Creeaz) i returneaz) o reprezentare strin" a excep iei curenteș ț , sintaxa
public overrie string *oString().
=ansarea unei excep ii se #ace #olosind instruc iuneaț ț t+ro4.
5
-
8/19/2019 Tratarea Excepțiilor În C#
6/19
C+nd este necesar de a se arunca% lansa o excep ie% este posi!ilitatea de a se utiliza unul sauț
&ai <e tipuri de excep ii existente in .@et.ț
Tipuri de excep ii si condi iile cînd pot fi lansate:ț ț
ArgumentException 0 exceptia este lansat) c+nd unul din ar"u&entele trans&is &etodei
este in*alid% sintaxa2SerializableAttribute3
2Com5isibleAttribute( true )3
public class ArgumentException 6 SystemException, ISerializable
Argument7ullException # ar"u&entul trans&is este nul% dar nu tre!uie sa #ie nul%
sintaxa
2SerializableAttribute3
2Com5isibleAttribute( true )3
public class Argument7ullException 6 ArgumentException
Argumentutf'angeException # -n aur"u&ent este +n a#ara inter*alului *alorilor
*alide% sintaxa
2SerializableAttribute3
2Com5isibleAttribute( true )3
public class Argumentutf'angeException 6 ArgumentException, Iserializable
Directory7ot0ounException 0 Excep ia care este lansat)% atunci cnd o parte a unuiț
#i ier sau director nu poate #i ")sit% sintaxaș
2SerializableAttribute3
2Com5isibleAttribute( true )3
public class Directory7ot0ounException 6 IException
Diviey8eroException 0 Excep ia este lansat) atunci cnd exist) o +ncercare de aț
di*iza o *aloare la zero Exe&plul 3% sintaxa
2SerializableAttribute3
2Com5isibleAttribute( true )3
public class Diviey8eroException 6 Arit+meticException
Drive7ot0ounException 0 Excep ia este lansat)% atunci cnd se +ncearc) s) seț
acceseze o unitate care nu este disponi!il)% sintaxa
2SerializableAttribute3
2Com5isibleAttribute( true )3 public class Drive7ot0ounException 6 IException
0ile7ot0ounException 0 Excep ia este lansat) atunci cnd se +ncerc) de a accesa unț
#i ier care nu exista% sintaxaș
2SerializableAttribute3
2Com5isibleAttribute( true )3
public class 0ile7ot0ounException 6 IException
6
-
8/19/2019 Tratarea Excepțiilor În C#
7/19
0ormatException 0 Excep ia este lansat)% atunci cnd #or&atul unui ar"u&ent esteț
in*alid Exe&plul 1% sintaxa
2SerializableAttribute3
2Com5isibleAttribute( true )3
public class 0ormatException 6 SystemException
Inexutf'angeException 0 Excep ia este lansat)% atunci cnd se +ncearc) de a sețaccesa un ele&ent dintr0o serie sau colec ie% cu un indice in*alid Exe&plul 4% sintaxaț
2SerializableAttribute3
2Com5isibleAttribute( true )3
public seale class Inexutf'angeException 6 SystemException
InvaliperationException 0 Excep ia este lansata% atunci cnd se apeleaz) o &etod)ț
ce nu este *ala!il) pentru starea curent) a o!iectului% sintaxa
2SerializableAttribute3
2Com5isibleAttribute( true )3
public class InvaliperationException 6 SystemException 9ey7ot0ounException 0 Excep ia este lansat)% atunci cnd cheia speci#icat) pentruț
accesarea unui ele&ent dintr0o colec ie% nu poate #i ")sit)% sintaxaț
2SerializableAttribute3
2Com5isibleAttribute( true )3
public class 9ey7ot0ounException 6 SystemException, ISerializable
7otImplementeException 0 Excep ia este lansat)% atunci cnd o &etod) sau oț
opera iune solicitat) nu este i&ple&entat)% sintaxaț
2SerializableAttribute3
2Com5isibleAttribute( true )3 public class 7otImplementeException 6 SystemException
7otSupporteException 0 Excep ia este lansat)% atunci c+nd o &etod) sau oțopera iune nu este acceptat)% sintaxaț
2SerializableAttribute3
2Com5isibleAttribute( true )3
public class 7otSupporteException 6 SystemException
b/ectDisposeException 0 Excep ia este lansat)% atunci c+nd o opera iune esteț ț
realizat) pe un o!iect care a #ost eli&inat% sintaxa
2SerializableAttribute3
2Com5isibleAttribute( true )3
public class b/ectDisposeException 6 InvaliperationException
verflo4Exception 0 Excep ia este lansat)% atunci c+nd o opera ie arit&etic) produceț țun rezultat care este +n a#ara inter*alului tipului de date returnat de opera ie Exe&plulț1% sintaxa
Derializa!le(ttri!uteDCo&7isi!le(ttri!ute true
7
-
8/19/2019 Tratarea Excepțiilor În C#
8/19
public class *er#loException (rith&eticException
:at+*oo%ongException 0 Excep ia este lansat)% atunci cnd un #i ier este &ai &areț ș
dect lun"i&ea &axi&) de#init) de siste&% sintaxa
2SerializableAttribute3
2Com5isibleAttribute( true )3
public class :at+*oo%ongException 6 IException :latform7otSupporteException 0 Excep ia este lansat)% atunci c+nd% opera iuneaț ț
dorit) nu este acceptat) pe plat#or&a actual)% sintaxa
2SerializableAttribute3
2Com5isibleAttribute( true )3
public class :latform7otSupporteException 6 7otSupporteException
'an&Exception 0 Excep ia este lansat)% atunci cnd un ta!lou cu un nu&)r "re it deț ș
di&ensiuni este trecut la o &etod)% sintaxa
2SerializableAttribute3
2Com5isibleAttribute( true )3 public class 'an&Exception 6 SystemException
*imeoutException 0 Excep ia este lansat)% atunci cnd ti&pul alocat pentru un procesț
sau o opera iune a expirat% sintaxaț
2SerializableAttribute3
2Com5isibleAttribute( true )3
public class *imeoutException 6 SystemException
;ri0ormatException 0 Excep ia este lansat)% atunci cnd este detectat un identi#icator ț
uni#or& de resurse in*alid -
-
8/19/2019 Tratarea Excepțiilor În C#
9/19
2. Blocurile Try – Catch – Finally
Cu*intele cheie rezer*ate +n C$ pentru tratarea excep iilor suntț try, catc+, finally, t+ro4.
(cestea reprezint) un siste& unitar% deoarece utilizarea unuia dintre ele% i&plic) i utilizarea altuia.ș
Blocul try con ine instruc iunele care tre!uie *eri#icate pentru apari ia erorilor. >ac) peț ț ț
parcursul execu ei aestora apare o excep ie aceasta este aruncat)% lansat) thron.ț ț
,rin inter&ediul !locului catc+ pro"ra&ul poate prinde excep ia i o poate trata.ț ș
Instruc iunile dinț catc+ se execut) doar dac) apare o excep ie. ,ot exista &ai &ulte instruc iuniț ț
catc+ asociate unui try (Exemplul
-
8/19/2019 Tratarea Excepțiilor În C#
10/19
"
-
8/19/2019 Tratarea Excepțiilor În C#
11/19
C=aca nu este "asit nici unț catc+%
atunci C=< *a a#isa un &esa' cu& ca excep ia nu este tratat)%ț un+anle exception message% apoi *a
opri execu ia pro"ra&ului Exe&plul 2.ț
Exe&plul 2 =ipsesc !locurile catc+. static voi ain( string 23 args)
int n = >!
string s!
Console.?rite( @n = @ )! s = Console.'ea%ine()!
try
n = int .:arse(s)!
"
finally
Console.?rite%ine(n)!
"
Console.'ea%ine()!
"
-
8/19/2019 Tratarea Excepțiilor În C#
12/19
Img. & ”'nhandled exception message”
Excep iile necesit) tratare di#erit) +n #un ie de tipul lor. Este i&portant de a se o#eri &ai &ulteț ț
!locuri catc+% con in+nd cod de tratare pentru #iecare tip de eroare +n parteț
Instruc iunile dintr0un !locț finally se execut) intotdeauna% chiar dac) o excep ie este prinsa sauț
nu. (cest !loc este #olosit pentru a Hcura a resursele #olosite +ntr0un !locț try si pentru a asi"ura
executarea unor instruc iuni de cod indi#erent de &odul +n care se iese din !locul precedent deț try.
Blocul try nu poate #i prezent #)r) !locul catc+ sau finally i nici in*ers. Bloculș finally esteo! ional.ț
try
in acest bloc exceptia este @aruncata@
"
catc+ in acest bloc exceptia este @prinsa@
"
finally
coul e curatare, optional
"
(st#el% succesiunea execuiei este ur&)toarea
J se execut) instruciunile din !locul try pn) la apariia unei exepii% +n cazul +n care nu se
declanKaz) nici o exepie se execut) +ntre"ul !loc5
J dac) a ap)rut o exepie se co&par) tipul exepiei cu tipurile din lista de catc+ Ki se execut)
!locul de instruciuni corespunz)tor pentru tratarea exepiei% co¶ia se #ace +n ordinea +n care
apar !locurile catc+% dup) execuia unui !loc catc+ nu se continu) cautarea +n celelalte !locuri catc+%
deci excepiile &ai "enerale tre!uie puse dup) excepiile particulare5
J se execut) instruciunile din !locul #inally indi#erent dac) a ap)rut sau nu o exepie Ki
indi#erent dac) aceasta a #ost tratat) sau nu512
-
8/19/2019 Tratarea Excepțiilor În C#
13/19
J daca nu a ap)rut nici o exepie sau dac) excepia a #ost tratat) printr0un !loc catch execuia
continu) cu instruciunile de dup) !locul #inally% alt#el excepia este propa"at) +n apelator.
Blocurile try B catc+ B finally pot #i incluse +n alte !locuri try.
Exe&plul 3 >eter&inarea restului +&p)r irii a dou) nu&ereț
Condul pro"ra&ului static voi ain( string 23 args)
int a, b, r=>!
a = int .:arse( Console.'ea%ine())!
b = int .:arse( Console.'ea%ine())!
Console.?rite( @'estul impartirii lui >" la
-
8/19/2019 Tratarea Excepțiilor În C#
14/19
static voi ain( string 23 args)
int 23 t = ,F,G,H,,
-
8/19/2019 Tratarea Excepțiilor În C#
15/19
". Crearea propriilor excep*ii
/n cazul +n care excep iile prede#inite nu sunt su#iciente% pro"ra&atorul + i poate construiț ș
propriile tipuri. e reco&and) ca acestea s) #ie deri*ate din System.ApplicationException, care estederi*at) direct din System.Exception. e reco&and) aceast) deri*are% deoarece ast#el se *a #ace
distinc ia +ntre excep iile aplica iei i cele de siste&.ț ț ț ș
Exe&plul L Crearea excep ieiț 5arstaInvalia
Codul pro"ra&ului
using System!
Definirea Exceptiei
class 5arstaInvalia 6 Exception
constructor
public 5arstaInvalia(int varsta)
6 base(varsta K @ nu este o valoare valia pentru varsta.@)
t+is.varsta = varsta!
"
private int varsta!
public int 5arsta
get return varsta! "
"
"
class :ersoana
constructor
public :ersoana(string nume, int varsta)
t+is.nume = nume!
t+is.varsta = varsta!
" public string 7ume
get return nume! "
"
public int 5arsta
get return varsta! "
15
-
8/19/2019 Tratarea Excepțiilor În C#
16/19
set
valiare varsta
if (value J > LL value M N>>)
t+ro4 ne4 5arstaInvalia(value)!
varsta = value!
" "
string nume!
int varsta!
"
class :rogram
static voi ain()
creare obiect
:ersoana ionel = ne4 :ersoana(@Ion@, N>)!
try
Console.?rite(@5arsta noua6@)!
ionel.5arsta = int.:arse(Console.'ea%ine())!
Console.?rite%ine(@5arsta noua este >".@, ionel.5arsta)!
"
catc+ (0ormatException)
Console.?rite%ine(@Eroare6 5arsta trebuie sa fie un intreg.@)!
"
catc+ (5arstaInvalia e)
Console.?rite%ine(@Eroare6 5arsta trebuie sa fie intre > si N>>.@)!
Console.?rite%ine(e.essage)!
"
finally
Console.?rite%ine(@>" are
-
8/19/2019 Tratarea Excepțiilor În C#
17/19
Img. - ”Excep*ia arstaInvalida”
=a setarea *+rstei in*alide I&".8 este aruncat) excep iaț 5arstaInvalia, care anun ) c) aț
ap)rut o excep ie prin inter&ediul &esa'ului ț 5arsta trebuie sa fie intre > si N>>% precu& i &esa'ulș
excep iei ț 022 nu este o valoare valia pentru varsta% prin inter&ediul instan ei de eroare e.ț
=a +ncercarea de a se seta *+rstei o *aloare ce nu este de tip +ntre"% este aruncat) excep iaț
0ormatException, ce anun ) c) *aloarea setat) nu poate #i con*ertit) +n +ntre" I&".Mț
Img. / ”Exceptia FormatException”
?esa'ul din !locul finally se *a a#i a indi#erent de ce se +nt+&pl) +n !luclș try, dac) apare oeroare% atunci *+rsta a#i at)% *a #i *+rsta setat) prin constructor% alt#el% se *a a#i a *+rsta citit) de laș ș
tastatura. I&". 8% I&".M.
17
-
8/19/2019 Tratarea Excepțiilor În C#
18/19
Conclu$ii
-n pro"ra&ator nu tre!uie s) con#unde tratarea excep iilor cu erorile sau !a"0urile. Erorile deț
run0ti&e pot ap)rea pentru o *arietate de &oti*e% cu toate acestea nu toate erorile tre!uie s) #ie
tratate ca excep ii. >e exe&plu un !a" este o eroare de pro"ra&are care ar tre!uie s) #ie #ixat)ț
+naintea li*rarii codului.
Excep iile nu sunt create pentru a pre*eni !a"0urile% deoarece !a"0urile tre!uie s) #ieț
eli&inate% cu toate c) un !a" poate s) duc) la apari ia unei excep ii. =a #el sunt i erorile de utilizare%ț ț ș
adic) o eroare +n lo"ica de pro"ra&% care poate duce la o excep ie. Cu toate acestea% eroarea ar tre!uiț
s) #ie a!ordat) nu prin tratarea exceptiilor% ci prin &odi#icarea codului de#ect.
Excep iile sunt situa iile neasteptate aparute +n cadrul siste&ului care ruleaza un pro"ra&.ț ț
,ro"ra&ele tre!uie s) #ie pre"atite pentru a trata aceste situatii excep ionale.ț
Tratarea excep iilor are ca a*anta' e*itarea +nchiderii anor&ale a pro"ra&ului. Cand o excep ieț ț
*a #i Haruncat)% ea *a #i Hprins) unde*a% +n cod. >ac) pro"ra&ul nu *a prinde excep ia% ea *a #iț
&anipulat) de runtime, care o *a trans#or&a +n eroare i *a +nchide pro"ra&ul.ș
18
-
8/19/2019 Tratarea Excepțiilor În C#
19/19
Bi0liogra%e
1.