Tratarea Excepțiilor În C#

download Tratarea Excepțiilor În C#

of 8

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 &lte 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&paraia 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.