12.1 Nevoia de manipulare excepție
În timpul funcționării sale, programul uneori se confruntă cu situații de urgență. De exemplu, o tehnică numită un obiect poate fi detectat la problemele interne (valori incorecte ale câmpurilor, având ca rezultat poate avea loc, de exemplu, se împarte la zero), sau pentru a găsi erori în alte obiecte sau intrări. Prin urmare, aveți nevoie de un mecanism pentru a detecta și de a face față situațiilor de urgență (excepții) în program.
Atunci când programul este construit din module separate și biblioteci în special atunci când aceste module sunt dezvoltate în mod independent, eroare de manipulare ar trebui să fie împărțită în două părți:
generarea de informații cu privire la originea situației de eroare, care nu pot fi rezolvate la nivel local;
eroare de manipulare se găsește în alte locuri.
Acest stil de eroare de manipulare este de preferat pentru multe dintre metodele tradiționale. Luați în considerare alternativa. Dacă vă confruntați cu o problemă care nu poate fi rezolvată la nivel local, programul poate:
a) opri execuția,
b) pentru a returna o valoare specială „greșit“,
c) sa returneze o valoare validă și se lasă programul în
d) să solicite o funcție pentru erori de procesare.
Opțiunea a) - pentru a opri executia - aceasta este ceea ce se întâmplă în mod implicit atunci când nu prind excepții. Pentru cele mai multe erori, trebuie să vii cu ceva mai bun. Funcția Library, cu siguranță, execuția finală, nu pot fi utilizate în program, prima cerință pentru că - fiabilitate.
Opțiunea b) - returnează o valoare specială „eronată“ - nu este întotdeauna posibil, pentru că de multe ori nu este pur și simplu nici o valoare de eroare acceptabilă (de exemplu, atunci când returnarea unui oricare dintre ele poate fi acceptabil). Chiar și atunci când se aplică această abordare, este adesea incomod, pentru că forțează programator de fiecare dată pentru a verifica rezultatul pe valoarea erorii. Acest lucru se poate dubla cu ușurință dimensiunea programului.
Opțiunea c) - returnează o valoare validă și se lasă programul într-o stare anormală - are dezavantajul că apelantul nu poate observa că programul este într-o stare anormală. De exemplu, multe dintre standardul funcției C bibliotecă setează valoarea errno variabila globala pentru a indica o eroare. Cu toate acestea, programul în cele mai multe cazuri, nu verifică această variabilă suficient în mod regulat pentru a evita erorile ulterioare. Mai mult decât atât, utilizarea variabilelor globale pentru informații despre eroare de înregistrare nu funcționează bine în prezența unor procese paralele.
Varianta d) - apela o funcție pentru erorile de procesare - deține funcția apelată pentru a rezolva una dintre metodele de mai sus.
Mecanismul de manipulare excepție oferă o alternativă la metodele tradiționale. Acesta vă permite să se separe codul de eroare de manipulare de la algoritmul de cod nativ, făcând astfel programul mai ușor de înțeles și mai „curat“. Rezultatul este un mod mai regulat al erorilor de manipulare, care simplifică interacțiunea dintre fragmentele de program scrise separat.
Principiile generale ale situațiilor de manipulare în C ++, Java și C #
Mecanismul de procesare situații oferă o modalitate de a transfera controlul de la punctul în executarea programului de la un punct situat deasupra controlului în care situația determinată de tratare (handler excepție). Ideea principală este că funcția se confruntă cu o problemă insolubilă, anunță o situație excepțională, în speranța că aceasta a cauzat (direct sau indirect) caracteristică poate rezolva problema. handler situație va fi numit decât dacă executarea operator-conducere-situație în așa-numita unitate de control-la-funcțiile sau numit din acest bloc. În C ++ și C # sintaxa situație de conducere este după cum urmează:
Sintaxa Java a situației de excitație este aceeași cu excepția faptului că aruncarea nu pot fi utilizate fără exprimare.
Operator-conducere-situație în C ++ este o expresie de un anumit tip. În Java și C # este întotdeauna un obiect de un anumit tip de excluziune, care ar trebui să fie descrisă în mod explicit. Operator de conducere auto situație, uneori, de asemenea, numit punct de apariție (excitație) Situația (arunca-punct). În partea a programului, care a fost umplut cu situația operatorului-excitație, spunând că a existat o situație (a deschis o situație) în ea.
Luați în considerare modul în C ++, puteți identifica și trata o serie de erori care apar în vectorul clasă.
clasă de <>; // situații de clasă
int Operatorul [] (int i);
Range obiecta clasa proiectat pentru a fi utilizat ca o excepție și să instituie mai târziu, după cum urmează:
int Vector :: Operatorul [] (int i)