Astfel de evenimente duc la terminarea programului cu un mesaj de eroare de sistem. Mecanismul de excepție vă permite să restaurați programul și să continuați executarea acestuia.
C ++ excepție de manipulare nu suporta evenimente asincrone (eroare de hardware sau de întrerupere de manipulare), și sunt numai pentru evenimente care au loc ca urmare a programului și sunt indicate în mod explicit.
Excepțiile împart procesul de calcul în două părți - detectarea unei situații de urgență și prelucrarea acesteia.
· Funcțiile care au detectat eroarea pot să nu știe cum să o remedieze, iar codul care utilizează această funcție nu poate determina originea erorii. Este real atunci când se utilizează funcții de bibliotecă și programe care constau în mai multe module,
· Pentru a trimite informații de eroare la funcția de apelare, nu este necesar să utilizați valorile returnate, parametrii sau variabilele globale.
Procedura de tratare a excepției:
· Se produce o eroare, iar funcția în care a apărut generează o excepție,
· Executarea blocului curent este terminată, căutatorul corespunzător este căutat și controlul este transferat la acesta,
· Dacă nu este găsit, se numește funcția de terminare standard, care la rândul său numește funcția de întrerupere, care blochează procesul curent. Puteți seta propria funcție de terminare a procesului.
O stivă de apel este o serie de apeluri care au fost apelate, dar nu au fost încă finalizate.
Stivuirea este procesul de eliberare a memoriei de sub variabilele locale și returnarea controlului către funcția de apelare. La sfârșitul funcției, stivuirea este dezlegată.
Din moment ce controlul poate fi returnat la punctul de asteptare, numai după finalizarea funcției, apoi, după excepția a fost înregistrată, executarea nu poate fi continuată este generat de la punctul de excepție.
Sintaxa blocului de control (codul în care poate fi aruncată o excepție):
Blocul de încercări include, de asemenea, funcții care sunt direct sau indirect solicitate din acesta.
Sintaxa pentru generarea unei excepții este:
Parametrul (expresia) transmite informații despre excepție de la manipulatorul său. Parametrul poate fi o constantă, o variabilă sau un obiect. Tipul parametrului (expresie) determină tipul excepției care trebuie ridicată.
De regulă, o excepție este aruncată în funcțiile închise în blocul try. Nu întotdeauna o astfel de excepție poate fi tratată imediat. În acest caz, se folosesc blocuri controlate imbricate, iar excepția este trecută la un nivel mai înalt utilizând cuvântul cheie aruncat fără parametri.
Sintaxa procesatorului (trei forme de înregistrare):
1. Aplicabil atunci când numele de excepție este utilizat în corpul operatorului pentru a efectua orice acțiune (de exemplu, trimiterea de informații despre excepție).
captură (nume de tip), unde parametrul de tip este tipul excepției.
2. Nu se utilizează informații despre numele excepției de la manipulator, numai rolul său joacă un rol.
3. Operatorul interceptează toate excepțiile.
Stivuitoarele sunt văzute în ordinea în care sunt scrise, astfel încât un manipulator de acest tip trebuie plasat după toate celelalte.
Dispozitivul de manipulare trebuie să fie situat direct în spatele încercării. Puteți scrie unul sau mai mulți manipulatori în funcție de tipurile de excepții procesate.
// Efectuați excepții de tip int
captură (const char *)
// Efectuați excepții de tip const char *
// Manipularea excepțiilor de depășire
// Manipulați toate excepțiile nefolosite
După manipularea excepției, controlul este transmis primului operator, care se află direct în spatele operatorilor de excepție. Dacă excepția din blocul de încercare nu a fost generată, controlul, care transmite codul tuturor agenți de procesare, este trecut la același punct.
După generarea unei excepții utilizând funcția de aruncare, biblioteca executabilă C ++ execută:
· Crearea unei copii a parametrului de aruncare sub forma unui obiect static (există până la procesarea excepției);
· Desfacerea stiva în căutarea unui handler adecvat (apelând distrugătorii obiectelor locale care părăsesc domeniul de aplicare). Toți utilizatorii de la fiecare nivel sunt văzuți secvențial, de la unitatea interioară la cea externă;
· Transferarea obiectului și gestionarea dispozitivului de procesare găsit.
Operatorul este considerat găsit dacă tipul obiectului specificat după aruncare:
· Coincide cu parametrul specificat în parametrul captură (poate fi scris în formularul T, const T, T sau const T, unde T este tipul de excepție);
· Este derivat din parametrul specificat în parametrul de captură (dacă moștenirea a fost făcută cu cheia de acces public). Prin urmare, manipulatorii de clasă derivată ar trebui să fie plasați în fața operatorilor de bază (altfel nu vor fi predați niciodată conducerii).
· Este un pointer care poate fi convertit prin reguli standard pentru conversia pointerilor la un tip de pointer din parametrul de captură. Pointerul de tipul void ar trebui să fie plasat după manipulatorii de pointeri de un anumit tip (ascunde un pointer de orice alt tip).
// Clasa care informează despre crearea și distrugerea sa
dacă ifs ("\\ INVALID \\ FILE \\ NAME"); // Deschideți fișierul
Rezultatele programului:
Introduceți blocul de încercare
Caracterul const char * a fost numit, excepție - Eroare la deschiderea fișierului
După generarea o excepție a fost cauzată de destructor unui obiect local, deși conducerea f1 funcție a fost transferată la tratare, care se află în funcția principală. Mesajul "Ieșire din blocul de încercare" nu a fost afișat.
Mecanismul de excepție vă permite distrugerea corectă a obiectelor atunci când apar erori. Prin urmare, este utilă alocarea și eliberarea resurselor sub formă de clase al căror constructor alocă o resursă, iar distribuitorul se eliberează.
Un exemplu este clasa pentru lucrul cu un fișier. Constructorul de clasă deschide fișierul și distrugătorul îl închide. Dacă apare o eroare, fișierul va fi închis corect și informațiile nu vor fi pierdute.
Excepția poate fi fie standard, fie definită de utilizator. Nu este necesar să se definească acest tip global - este suficient ca acesta să fie cunoscut la punctul de generare excepțional și la punctul de prelucrare a acestuia.
O clasă pentru reprezentarea unei excepții poate fi descrisă într-o clasă, atunci când se lucrează cu ea. această copie constructorul clasei trebuie să fie declarate ca publice, în caz contrar va fi imposibil de a crea o copie a unui obiect cu o excepție (constructorul copy, creat în mod implicit, are un specificator public).
Excepții în funcție
În antetul funcției, puteți specifica o listă de excepții pe care le poate genera direct sau indirect. Tipurile de excepții sunt enumerate în paranteze separate prin virgule după aruncarea cuvântului cheie aflată în spatele listei parametrilor funcției:
void fl () arunca (int, const char *)* Тело функции */>
Funcția fl ar trebui să genereze excepții numai de tipurile int și const char *, f2 - numai excepții de tip pointer la clasa Oops sau clasele sale derivate.
Dacă nu este specificat cuvântul cheie aruncare, funcția poate genera orice excepție. O listă goală înseamnă că funcția nu ar trebui să facă excepții:
// Corpul unei funcții care nu aruncă excepții
Titlul este funcțiile de interfață, astfel încât să specifice aceasta lista de excludere oferă informații pentru utilizarea sa, precum și o garanție că, în cazul unor excepții neprevăzute, această situație este detectată (funcția poate fi direct sau indirect, dau naștere la o excepție care nu este descrisă în interfața sa).
Apariția unei excepții neașteptate duce la apelul la funcția standard neașteptată, care implicit apelează funcția de terminare (Figura 2.3). Prin utilizarea set_unexpected puteți seta funcția de propria dvs., care va fi numit în loc de a rezilia și de a determina efectul programului în cazul unei excepții neașteptate.
Funcția termină apelează funcția de întrerupere în mod prestabilit, care termină programul. Folosind funcția set_terminate, puteți seta propria funcție, care va fi apelată în loc de a întrerupe și a determina cum se termină programul. Funcțiile set_unexpected și set_terminate sunt descrise în fișierul header
Figura 2.3 - Algoritmul de manipulare a excepțiilor.
Excepțiile nu fac parte din prototipul funcției. Când suprascrieți o funcție virtuală într-o clasă derivată, puteți specifica o listă de excepții care este aceeași sau mai limitată decât funcția corespunzătoare din clasa de bază.