Iată un fapt interesant: Niciun cod nu este lipsit de erori - de fapt, unele coduri sunt pline de „erori” intenționate.
Ce este o eroare într-o aplicație? O eroare este o soluție codată incorect la o problemă. Acestea sunt erori logice care ar putea duce la rezultate greșite ale funcției, în cazul în care totul pare bine pus la punct, dar rezultatul aplicației este complet inutilizabil. Cu erori de logică, o aplicație ar putea sau nu să funcționeze.
Excepții pot include erori în codul dvs. în care încercați să împărțiți numerele cu zero sau încercați să utilizați blocuri de memorie eliberate sau să încercați să furnizați parametri greși unei funcții. Cu toate acestea, o excepție dintr-o aplicație nu este întotdeauna o eroare.
Excepție sunt condiții speciale care necesită o manipulare specială. Când apare o condiție de tip eroare, programul ridică o excepție.
Voi (în calitate de scriitor de aplicații) veți gestiona excepții pentru ca aplicația dvs. să fie mai predispusă la erori și să răspundă la condiția excepțională.
În cele mai multe cazuri, veți găsi că sunteți scriitorul de aplicații și, de asemenea, scriitorul bibliotecii. Așadar, va trebui să știți cum să ridicați excepții (din biblioteca dvs.) și cum să le gestionați (din aplicația dvs.).
Articolul despre gestionarea erorilor și a excepțiilor oferă câteva recomandări de bază despre cum să vă feriți de erori folosind try / except / end și try / finalment / end blocuri protejate pentru a răspunde sau pentru a gestiona condiții excepționale.
O simplă încercare / cu excepția blocurilor de pază arată:
încerca
ThisFunctionMightRaiseAnException ();
cu exceptia// gestionați aici toate excepțiile ridicate în ThisFunctionMightRaiseAnException ()
Sfârșit;
ThisFunctionMightRaiseAnException poate avea, în implementarea sa, o linie de cod asemănătoare
a ridica Excepție.Create („condiție specială!”);
Excepția este o clasă specială (una dintre câteva fără T în fața numelui) definită în unitatea sysutils.pas. Unitatea SysUtils definește mai mulți descendenți de excepție cu scop special (și creează astfel o ierarhie de clase de excepție) precum ERangeError, EDivByZero, EIntOverflow, etc..
În cele mai multe cazuri, excepțiile pe care le-ați gestiona în blocul încercat / cu excepția blocului protejat nu ar fi din clasa Excepție (bază), ci a unei clase descendente speciale de excepție definită fie în VCL, fie în biblioteca pe care o utilizați.
Pentru a prinde și gestiona un tip de excepție, ar trebui să construiți un handler de excepții „on type_of_exception do”. „Excepție face” seamănă mai mult cu afirmația cazului clasic:
încerca
ThisFunctionMightRaiseAnException;
excepton EZeroDivide dobegin// ceva când se împarte la zeroSfârșit;
pe EIntOverflow dobegin// ceva când calculul întreg prea mareSfârșit;
elsebegin// ceva când sunt ridicate alte tipuri de excepțieSfârșit;
Sfârșit;
Rețineți că partea cealaltă ar acoperi toate (celelalte) excepții, inclusiv cele despre care nu știți nimic. În general, codul dvs. ar trebui să se ocupe doar de excepții pe care de fapt știți să le gestionați și așteptați să fie aruncate.
De asemenea, nu ar trebui să „mâncați” niciodată o excepție:
încerca
ThisFunctionMightRaiseAnException;
cu exceptia
Sfârșit;
Mâncarea excepției înseamnă că nu știți cum să gestionați excepția sau nu doriți ca utilizatorii să vadă excepția sau nimic între ele.
Când gestionați excepția și aveți nevoie de mai multe date din ea (până la urmă este o instanță a unei clase), mai degrabă numai tipul de excepție pe care îl puteți face:
încerca
ThisFunctionMightRaiseAnException;
excepton E: Excepție dobegin
ShowMessage (E.Message);
Sfârșit;
Sfârșit;
„E” din „E: excepție” este o variabilă de excepție temporară de tip specificată după caracterul coloanei (în exemplul de mai sus, clasa de excepție de bază). Folosind E puteți citi (sau scrie) valori la obiectul de excepție, cum ar fi obține sau seta proprietatea Mesaj.
Ați observat cum sunt de fapt excepțiile cazurilor unei clase care coboară din Excepție? Cuvântul cheie de creștere aruncă o instanță de clasă de excepție. Ceea ce creați (instanța de excepție este un obiect), trebuie, de asemenea, să eliberați. Dacă (ca scriitor de bibliotecă) creați o instanță, utilizatorul aplicației o va elibera?
Iată magia Delphi: Manevrarea unei excepții distruge automat obiectul de excepție. Aceasta înseamnă că atunci când scrieți codul în blocul „cu excepția / sfârșitul”, acesta va elibera memoria de excepție.
Deci, ce se întâmplă dacă ThisFunctionMightRaiseAnException ridică de fapt o excepție și nu o manipulați (nu este același lucru cu „mâncarea”)?
Atunci când o excepție neînfășurată este aruncată în codul dvs., Delphi gestionează din nou magia excepția afișând dialogul de eroare către utilizator. În majoritatea cazurilor, această fereastră de dialog nu va oferi suficiente date pentru ca utilizatorul (și în cele din urmă tu) să înțeleagă cauza excepției.
Aceasta este controlată de bucla de mesaj de nivel superior a Delphi unde toate excepții sunt procesate de obiectul aplicației globale și metoda lui HandleException.
Pentru a gestiona excepțiile la nivel mondial și pentru a arăta dialogul dvs. mai ușor de utilizat, puteți scrie cod pentru gestionatorul de evenimente TApplicationEvents.OnException.
Rețineți că obiectul aplicației globale este definit în unitatea Formulare. TApplicationEvents este o componentă pe care o puteți utiliza pentru a intercepta evenimentele obiectului Aplicației globale.