manipulare excepție, de programare în C și c

excepție de manipulare (manipulare excepție) vă permite să eficientizeze procesarea erorilor run-time. Folosind tratarea excepțiilor C ++, programul poate provoca în mod automat funcția de eroare de manipulare, atunci când se produce această eroare. Manevrabilitatea-principal demn stvom excepție este că vă permite să automatizeze majoritatea codului pentru erorile de manipulare, care a necesitat anterior manual de codificare.

prelucrare bazată pe excepții

Excepție de manipulare în C ++, folosind trei cuvinte cheie: încercați, de captură și arunca. Aceste instrucțiuni de program, care va posibilitatea de excepții cuprinse în BLO-ke încercați. În cazul în care blocul try ridică o excepție, adică. E. Eroarea, apoi o excepție este aruncată. SUP-chenie capturate folosind declarația de captură, și procesată. Ceea ce urmează este o descriere generală va fi în căutarea cursele cu mai multe detalii.

Instrucțiunea generează o excepție, trebuie să fie efectuate în interiorul blocului try. bloc try mioclonice ale funcției poate genera, de asemenea excepții. Orice excepție trebuie să fie re-hvacheno instrucțiuni de captură, care urmează imediat încercare de instrucțiuni, aruncând-o excepție de gât. Forma generală a try and catch blocuri este prezentat mai jos:

încercați // încercați bloc
captura (argument tipul1) // bloc de captură
captura (argument type2) // bloc de captură
captura (argument tipZ) // bloc de captură
>
.
captura (argument tipN) // bloc de captură
>

încercați mărimi de blocuri pot varia în limite largi. De exemplu, blocul try poate conține mai multe declarații ale unei funcții, sau, dimpotrivă, să includă toate funcțiile principale de cod (), astfel încât întregul program va fi acoperit de manipulare excepție.

Atunci când o excepție este aruncată, este prins de declarația de captură de instrucțiuni corespunzătoare, o prelucrare excepție. Un bloc poate încerca să răspundă la mai multe captură, Ce fel de declarație de captură este executată depinde de tipul de excepție. Acest lucru înseamnă că, în cazul în care tipul de date specificat în declarația de captură, corespunde tipului de date excepție, doar că declarația de captură va fi executată. Atunci când o excepție este prins, arg devine valoarea sa. Interceptat poate fi orice tip de date, inclusiv clase de programator. Dacă nu excepții nu sunt generate, adică, nici o eroare a avut loc în blocul try, declarațiile de captură nu va fi executat.

Forma generală a înregistrării declarație aruncare este:

instrucțiuni aruncare trebuie să fie executate fie în cadrul blocului try, sau o funcție numită de unitatea de încercare. În expresia de mai sus de excludere înregistrate generată valoare desemnați.

În cazul în care o excepție este aruncată, pentru care nu există nici o declarație de instrucțiuni de captură adecvat, poate să apară o terminare anormală a programului. La generarea o excepție netratată
apeluri termina funcția (). În mod implicit, termina () apeluri abort () finisaj funcție conductoare program. Cu toate acestea, puteți seta propria procesare folosind fun-ktsiyu set_terminate (). Detalii pot fi găsite în documentația de compilator.

Mai jos este un exemplu care ilustrează o metodă pentru tratarea exceptiilor in C ++:

// exemplu de manipulare simplă excepție
#include
int main ()
cout <<"Start\n";
încerca cout <<"Inside try block\n";
arunca 100; // genera o eroare
cout <<"This will not execute";
>
catch (i int) cout <<"Caught an exception -- value is: ";
cout <>
cout <<"End";
return 0;
>

Programul va afișa următorul text:

start
În interiorul blocului try
Prins o excepție - valoare este: 100
capăt

Luați în considerare cu atenție acest program. După cum puteți vedea, blocul try conține trei instrucțiuni. Urmat de declarația de captură (int i), să se ocupe de excepțiile de tip întreg. În blocul try se va efectua doar două instrucțiuni: prima și a doua - aruncare. Odată ce o excepție a fost generată, controlul este trecut pentru a prinde declarații, și să încerce blocul oprește executarea sa. Astfel, captura nu este numit. Mai degrabă, putem spune că trece execuția programului. Pentru a face acest lucru în mod automat reinstalării stivă efectuate. Astfel, inst ruktsiya după declarația de aruncare nu este executată.

De obicei, codul în instrucțiunea de captură încearcă să corecteze eroarea prin efectuarea acțiunii corespunzătoare. Dacă eroarea corectată, executarea continuă cu declarația directă-guvernamentală în urma capturii. Cu toate acestea, uneori, nu se poate face față cu o eroare, iar blocul catch-Zavar programul cutele prin apelarea la ieșirea () sau să abandoneze funcția ().

După cum sa menționat, tipul de excepție trebuie să se potrivească cu tipul specificat în instrucțiunile. De exemplu, măsurile în exemplul anterior, dacă schimbați tipul de declarație de captură pentru a dubla, excepția nu este prins și nu va fi un accident de program. Această modificare este prezentată mai jos:

// acest exemplu nu va funcționa
#include
int main ()
cout <<"Start\n";
încerca cout <<"Inside try block\n";
arunca 100; // genera o eroare
cout <<"This will not execute";
>
captura (i dublu) cout <<"Caught an exception -- value is: ";
cout <>
cout <<"End";
return 0;
>

Acest program produce următorul rezultat ca o excepție de tip nu va fi re-hvacheno instrucțiuni de captură (dublu i):

start
În interiorul blocului try
Programul anormal de terminare

O excepție poate fi generată de funcția numită din cadrul blocului try. Ca un exemplu, luați în considerare următorul program:

/ * Generează o excepție de la o funcție care este în afara blocului try
* /
#include
anula Xtest (testul int)
cout <<"Inside Xtest, test is: " < în cazul în care (test) test de aruncare;
>
int main ()
cout <<"Start\n";
încerca cout <<"Inside try block\n";
Xtest (0);
Xtest (1);
Xtest (2);
>
catch (i int) cout <<"Caught an exception -- value is: ";
cout <>
cout <<"End";
return 0;
>

Acest program produce următorul rezultat:

start
În interiorul blocului try
În interiorul Xtest, testul este: 0
În interiorul Xtest, testul este: 1
Prins o excepție - valoare nu este: 1
capăt

Un bloc de încercare poate fi localizată într-o anumită funcție. În acest caz, de fiecare dată când introduceți funcția începe de manipulare excepție. Ca un exemplu, să ia în considerare pro-gram:

#include
// încercați / captură poate fi o funcție principală în afara ()
anula Xhandler (testul int)
încercați în cazul în care (test) test de aruncare;
>
captura (int i) cout <<"Caught Exception #: " <>
>
int main ()
cout <<"Start\n";
Xhandler (1);
Xhandler (2);
Xhandler (0);
Xhandler (3);
cout <<"End";
return 0;
>

Acest program va afișa următorul text:

start
Prins Excepție #: 1
Prins Excepție #: 2
Prins Excepție #: 3
capăt

După cum se poate observa, ea a generat trei excepții. Fiecare funcție returnează o excepție consiliile-Lenie în funcția principală. Cu fiecare nou apel de manipulare excepție funcția returnează.

Este important să se înțeleagă faptul că codul asociat cu declarația de captură care urmează să fie executate numai atunci când a prins o excepție. În caz contrar, programul doar imaginea de fundal, copiii prind declarație.

articole similare