Programmā C++ izņēmumi ir izpildlaika anomālijas vai neparasti apstākļi, ar kuriem programma saskaras tās izpildes laikā. Šo izņēmumu apstrādes procesu sauc par izņēmumu apstrādi. Izmantojot izņēmumu apstrādes mehānismu, vadību no vienas programmas daļas, kurā notika izņēmums, var pārsūtīt uz citu koda daļu.
Tātad pamatā izmantojot izņēmumu apstrādi C++, mēs varam rīkoties ar izņēmumiem, lai mūsu programma turpinātu darboties.
kas ir 10 no 60
Kas ir C++ izņēmums?
Izņēmums ir neparedzēta problēma, kas rodas programmas izpildes laikā, un mūsu programma pēkšņi tiek pārtraukta ar dažām kļūdām/problēmām. Izņēmums notiek programmas darbības laikā (izpildlaikā).
C++ izņēmumu veidi
Programmā C++ ir divu veidu izņēmumi
- Sinhrons: Izņēmumi, kas rodas, ja kaut kas noiet greizi ievades datu kļūdas dēļ vai ja programma nav aprīkota, lai apstrādātu pašreizējo datu veidu, ar kuru tā strādā, piemēram, skaitļa dalīšana ar nulli.
- Asinhrons : izņēmumi, kurus programma nevar kontrolēt, piemēram, diska kļūme, tastatūras pārtraukumi utt.
C++ pamēģini un noķer
C++ nodrošina iebūvētu līdzekli izņēmumu apstrādei. To var izdarīt, izmantojot šādus specializētos atslēgvārdus: mēģināt, noķert un mest, katram no tiem ir atšķirīgs mērķis.
Try-catch sintakse programmā C++
try { // Code that might throw an exception throw SomeExceptionType('Error message'); } catch ( ExceptionName e1 ) { // catch block catches the exception that is thrown from try block }> 1. Izmēģiniet C++
Atslēgvārds try ir koda bloks, kas var radīt izņēmumu, kas ievietots try blokā. Tam seko viens vai vairāki uztveršanas bloki. Ja rodas izņēmums, mēģiniet bloķēt šo izņēmumu.
2. noķert C++
Paziņojums Catch ir koda bloks, kas tiek izpildīts, kad no try bloka tiek izmests konkrēts izņēmums. Kods izņēmuma apstrādei ir ierakstīts nozvejas blokā.
3. iemet C++
Izņēmums C++ var tikt izmests, izmantojot atslēgvārdu throw. Kad programma saskaras ar metiena paziņojumu, tā nekavējoties pārtrauc pašreizējo funkciju un sāk atrast atbilstošu uztveršanas bloku, lai apstrādātu izmesto izņēmumu.
Piezīme: Var izmantot vairākus nozvejas paziņojumus, lai uztvertu dažāda veida izņēmumus, ko rada try bloks.
Atslēgvārdi try and catch ir pieejami pa pāriem: mēs izmantojam try bloku, lai pārbaudītu kādu kodu, un, ja kods rada izņēmumu, mēs to apstrādāsim savā uztveršanas blokā.
Kāpēc mums vajag Izņēmumu apstrāde programmā C++?
Tālāk ir norādītas galvenās izņēmumu apstrādes priekšrocības salīdzinājumā ar tradicionālo kļūdu apstrādi.
- Kļūdu apstrādes koda atdalīšana no parastā koda : Vienmēr pastāv ja-cits nosacījumi, lai apstrādātu kļūdas tradicionālajos kļūdu apstrādes kodos. Šie nosacījumi un kļūdu novēršanas kods tiek sajaukti ar parasto plūsmu. Tas padara kodu mazāk lasāmu un uzturējamu. Izmantojot try/catch blokus, kļūdu apstrādes kods tiek atdalīts no parastās plūsmas.
- Funkcijas/metodes var rīkoties tikai ar izņēmumiem, ko tās izvēlas : Funkcija var radīt daudz izņēmumu, bet var izvēlēties apstrādāt dažus no tiem. Pārējos izņēmumus, kas tiek izmesti, bet nenoķerti, var rīkoties zvanītājs. Ja zvanītājs izvēlas viņus nepieķert, izņēmumus apstrādā zvanītāja zvanītājs.
Programmā C++ funkcija var norādīt izņēmumus, ko tā izmet, izmantojot atslēgvārdu throw. Šīs funkcijas izsaucējam ir kaut kādā veidā jārīkojas ar izņēmumu (vai nu vēlreiz norādot, vai noķerot).
- Kļūdu veidu grupēšana : Programmā C++ kā izņēmumus var izmest gan pamata tipus, gan objektus. Mēs varam izveidot izņēmumu objektu hierarhiju, grupēt izņēmumus nosaukumvietās vai klasēs un klasificēt tos pēc to veidiem.
Izņēmumu apstrādes piemēri programmā C++
Šie piemēri parāda, kā izmantot try-catch bloku, lai apstrādātu izņēmumus programmā C++.
1. piemērs
Zemāk redzamais piemērs parāda izņēmumus C++ valodā.
C++
// C++ program to demonstate the use of try,catch and throw> // in exception handling.> #include> #include> using> namespace> std;> int> main()> {> >// try block> >try> {> >int> numerator = 10;> >int> denominator = 0;> >int> res;> >// check if denominator is 0 then throw runtime> >// error.> >if> (denominator == 0) {> >throw> runtime_error(> >'Division by zero not allowed!'>);> >}> >// calculate result if no exception occurs> >res = numerator / denominator;> >//[printing result after division> >cout <<>'Result after division: '> << res << endl;> >}> >// catch block to catch the thrown exception> >catch> (>const> exception& e) {> >// print the exception> >cout <<>'Exception '> << e.what() << endl;> >}> >return> 0;> }> |
>
>Izvade
Exception Division by zero not allowed!>
2. piemērs
Šis ir vienkāršs piemērs, lai parādītu izņēmumu apstrādi programmā C++. Programmas izvade izskaidro try/catch bloku izpildes plūsmu.
CPP
// C++ program to demonstate the use of try,catch and throw> // in exception handling.> #include> using> namespace> std;> int> main()> {> >int> x = -1;> >// Some code> >cout <<>'Before try
'>;> >// try block> >try> {> >cout <<>'Inside try
'>;> >if> (x <0) {> >// throwing an exception> >throw> x;> >cout <<>'After throw (Never executed)
'>;> >}> >}> >// catch block> >catch> (>int> x) {> >cout <<>'Exception Caught
'>;> >}> >cout <<>'After catch (Will be executed)
'>;> >return> 0;> }> |
>
>Izvade
Before try Inside try Exception Caught After catch (Will be executed)>
Izņēmumu apstrādes īpašības programmā C++
1. īpašums
Ir īpašs nozvejas bloks, ko sauc par “catch-all” bloku, kas rakstīts kā catch (…), ko var izmantot, lai uztvertu visu veidu izņēmumus.
Piemērs
Nākamajā programmā int tiek izmests kā izņēmums, bet int nav noķeršanas bloka, tāpēc tiks izpildīts bloks catch(…).
CPP
json failu
// C++ program to demonstate the use of catch all> // in exception handling.> #include> using> namespace> std;> int> main()> {> >// try block> >try> {> >// throw> >throw> 10;> >}> >// catch block> >catch> (>char>* excp) {> >cout <<>'Caught '> << excp;> >}> >// catch all> >catch> (...) {> >cout <<>'Default Exception
'>;> >}> >return> 0;> }> |
>
>Izvade
Default Exception>
2. īpašums
Netieša tipa konvertēšana nenotiek primitīviem tipiem.
Piemērs
Nākamajā programmā “a” netiek netieši pārveidots par int.
CPP
//// C++ program to demonstate property 2: Implicit type> /// conversion doesn't happen for primitive types.> // in exception handling.> #include> using> namespace> std;> int> main()> {> >try> {> >throw> 'a'>;> >}> >catch> (>int> x) {> >cout <<>'Caught '> << x;> >}> >catch> (...) {> >cout <<>'Default Exception
'>;> >}> >return> 0;> }> |
>
>Izvade
Default Exception>
Izvade:
Default Exception>
3. īpašums
Ja izmet izņēmumu un nekur nenoķer, programma nenormāli beidzas.
Piemērs
Nākamajā programmā tiek izmesta žagars, bet nav neviena nozvejas bloka, lai to noķertu.
CPP
// C++ program to demonstate property 3: If an exception is> // thrown and not caught anywhere, the program terminates> // abnormally in exception handling.> #include> using> namespace> std;> int> main()> {> >try> {> >throw> 'a'>;> >}> >catch> (>int> x) {> >cout <<>'Caught '>;> >}> >return> 0;> }> |
>
>
Izvade
interfeiss java
terminate called after throwing an instance of 'char'>
Mēs varam mainīt šo neparasto izbeigšanas uzvedību, ierakstot mūsu neparedzēto funkciju.
Piezīme : atvasināts klases izņēmums ir jānoķer pirms bāzes klases izņēmuma.
Tāpat kā Java, C++ bibliotēkai ir a standarta izņēmums klase, kas ir pamatklase visiem standarta izņēmumiem. Visi objekti, ko izmet standarta bibliotēkas komponenti, ir atvasināti no šīs klases. Tāpēc visus standarta izņēmumus var noķert, ķerot šo tipu.
4. īpašums
Atšķirībā no Java, programmā C++ visi izņēmumi nav atzīmēti, t.i., kompilators nepārbauda, vai izņēmums ir noķerts vai nē (sk. šis sīkākai informācijai). Tātad funkcijas deklarācijā nav nepieciešams norādīt visus nenotvertos izņēmumus. Tomēr izņēmuma gadījumos tā ir ieteicama prakse.
Piemērs
Tālāk norādītā programma kompilējas labi, taču ideālā gadījumā fun() parakstam ir jānorāda neatzīmētie izņēmumi.
CPP
// C++ program to demonstate property 4 in exception> // handling.> #include> using> namespace> std;> // This function signature is fine by the compiler, but not> // recommended. Ideally, the function should specify all> // uncaught exceptions and function signature should be> // 'void fun(int *ptr, int x) throw (int *, int)'> void> fun(>int>* ptr,>int> x)> {> >if> (ptr == NULL)> >throw> ptr;> >if> (x == 0)> >throw> x;> >/* Some functionality */> }> int> main()> {> >try> {> >fun(NULL, 0);> >}> >catch> (...) {> >cout <<>'Caught exception from fun()'>;> >}> >return> 0;> }> |
>
>Izvade
Caught exception from fun()>
Labāks veids, kā rakstīt iepriekš minēto kodu:
CPP
// C++ program to demonstate property 4 in better way> #include> using> namespace> std;> // Here we specify the exceptions that this function> // throws.> void> fun(>int>* ptr,>int> x)>throw>(> >int>*,>int>)>// Dynamic Exception specification> {> >if> (ptr == NULL)> >throw> ptr;> >if> (x == 0)> >throw> x;> >/* Some functionality */> }> int> main()> {> >try> {> >fun(NULL, 0);> >}> >catch> (...) {> >cout <<>'Caught exception from fun()'>;> >}> >return> 0;> }> |
>
>Izvade
Caught exception from fun()>
Piezīme : Dinamiskās izņēmuma specifikācijas izmantošana ir novecojusi kopš C++11. Viens no iemesliem var būt tas, ka tas var nejauši pārtraukt jūsu programmu. Tas var notikt, ja izmetat cita veida izņēmumu, kas nav minēts dinamiskā izņēmuma specifikācijā. Programma pati pārtrauks darbību, jo šajā gadījumā tā (netieši) izsauc terminate (), kas pēc noklusējuma izsauc abortu ().
5. īpašums
Programmā C++ try/catch blokus var ligzdot. Tāpat izņēmums var tikt pārmests, izmantojot metienu; .
Piemērs
Šī programma parāda try/catch bloku ligzdošanu.
java savienojums mysql
CPP
// C++ program to demonstrate try/catch blocks can be nested> // in C++> #include> using> namespace> std;> int> main()> {> >// nesting of try/catch> >try> {> >try> {> >throw> 20;> >}> >catch> (>int> n) {> >cout <<>'Handle Partially '>;> >throw>;>// Re-throwing an exception> >}> >}> >catch> (>int> n) {> >cout <<>'Handle remaining '>;> >}> >return> 0;> }> |
>
>Izvade
Handle Partially Handle remaining>
Funkcija var arī atkārtoti iemest funkciju, izmantojot to pašu metienu; sintakse. Funkcija var apstrādāt daļu un lūgt zvanītājam apstrādāt atlikušo daļu.
6. īpašums
Kad tiek izmests izņēmums, visi objekti, kas izveidoti aptverošā mēģinājuma blokā, tiek iznīcināti, pirms vadība tiek nodota nozvejas blokam.
Piemērs
Sekojošā programma parāda iepriekš minēto īpašību.
CPP
java saraksta lodziņš
// C++ program to demonstrate> #include> using> namespace> std;> // Define a class named Test> class> Test {> public>:> >// Constructor of Test> >Test() { cout <<>'Constructor of Test '> << endl; }> >// Destructor of Test> >~Test() { cout <<>'Destructor of Test '> << endl; }> };> int> main()> {> >try> {> >// Create an object of class Test> >Test t1;> >// Throw an integer exception with value 10> >throw> 10;> >}> >catch> (>int> i) {> >// Catch and handle the integer exception> >cout <<>'Caught '> << i << endl;> >}> }> |
>
>Izvade
Constructor of Test Destructor of Test Caught 10>
Izņēmumu apstrādes ierobežojumi programmā C++
Izņēmumu apstrādei C++ ir arī daži ierobežojumi:
- Izņēmumi var sabojāt koda struktūru vai plūsmu, jo kodā tiek izveidoti vairāki neredzami izejas punkti, kas padara kodu grūti lasāmu un atkļūdojamu.
- Ja izņēmumu apstrāde netiek veikta pareizi, var rasties arī resursu noplūde.
- Ir grūti iemācīties rakstīt drošu izņēmuma kodu.
- Nav C++ standarta, kā izmantot izņēmumu apstrādi, tāpēc pastāv daudzas izņēmumu apstrādes prakses variācijas.
Secinājums
Izņēmumu apstrāde programmā C++ tiek izmantota, lai risinātu neparedzētus notikumus, izmantojot try and catch blokus, lai efektīvi pārvaldītu problēmu. Šī izņēmumu apstrāde padara mūsu programmas uzticamākas, jo kļūdas izpildlaikā var apstrādāt atsevišķi, kā arī palīdz novērst programmas avāriju un pēkšņu programmas pārtraukšanu, ja tiek konstatēta kļūda.
Saistītie raksti:
- Populārākie C++ izņēmumu apstrādes interviju jautājumi un atbildes
- Viktorīna par izņēmumu apstrādi programmā C++