C++ Rukovanje iznimkama: Primjer pokušaja, uhvati, baci
U čemu je rukovanje iznimkama C++?
Upravljanje iznimkama C++ pruža vam način rješavanja neočekivanih okolnosti kao što su pogreške tijekom izvođenja. Dakle, kad god se dogodi neočekivana okolnost, kontrola programa se prenosi na posebne funkcije poznate kao rukovatelji.
Da biste uhvatili iznimke, stavljate dio koda pod inspekciju iznimki. Dio koda nalazi se unutar bloka try-catch.
Ako se dogodi iznimna situacija unutar tog dijela koda, bit će izbačena iznimka. Zatim će rukovatelj iznimkama preuzeti kontrolu nad programom.
U slučaju da se ne dogode izvanredne okolnosti, kôd će se normalno izvršiti. Rukovatelji će biti zanemareni.
U ovom C++ tutorial, naučit ćete:
Zašto rukovanje iznimkama?
Evo razloga za korištenje rukovanja iznimkama C++:
- Odvojit ćete svoj kod za obradu pogrešaka od uobičajenog koda. Kod će biti čitljiviji i lakši za održavanje.
- Funkcije se mogu nositi s iznimkama koje odaberu. Čak i ako funkcija izbaci mnoge iznimke, obradit će samo neke. Pozivatelj će obraditi neuhvaćene iznimke.
Ključne riječi za rukovanje iznimkama
Upravljanje iznimkama C++ vrti se oko ove tri ključne riječi:
- baciti– kada program naiđe na problem, izbacuje iznimku. Ključna riječ throw pomaže programu da izvede bacanje.
- ulov– program koristi rukovatelj iznimkama za hvatanje iznimke. Dodaje se odjeljku programa u kojem trebate riješiti problem. To se radi pomoću ključne riječi catch.
- pokušati– blok pokušaja identificira blok koda za koji će se aktivirati određene iznimke. Nakon njega treba slijediti jedan/više catch blokova.
Pretpostavimo da će blok koda izazvati iznimku. Iznimka će biti uhvaćena metodom koja koristi ključne riječi pokušaj i uhvati. Blok try/catch trebao bi okruživati kod koji može izazvati iznimku. Takav kod je poznat kao zaštićeni kod.
Sintaksa
Try/catch ima ovu sintaksu:
try { // the protected code } catch( Exception_Name exception1 ) { // catch block } catch( Exception_Name exception2 ) { // catch block } catch( Exception_Name exceptionN ) { // catch block }
- Iako imamo jednu naredbu try, možemo imati mnogo naredbi catch.
- ExceptionName je naziv iznimke koju treba uhvatiti.
- Iznimka1, iznimka2 i iznimkaN su vaša definirana imena za pozivanje na iznimke.
Primjer 1:
#include<iostream> #include<vector> using namespace std; int main() { vector<int> vec; vec.push_back(0); vec.push_back(1); // access the third element, which doesn't exist try { vec.at(2); } catch (exception& ex) { cout << "Exception occurred!" << endl; } return 0; }
Izlaz:
Evo snimke zaslona koda:
Objašnjenje koda:
- Uključite iostream datoteku zaglavlja u program da biste je koristili Funkcije.
- Uključite vektorsku datoteku zaglavlja u program za korištenje njegovih funkcija.
- Uključite prostor imena std u program u njegove klase bez njegovog pozivanja.
- Pozovite funkciju main(). Programsku logiku treba dodati unutar njegovog tijela.
- Kreirajte vektor pod nazivom vec za pohranjivanje cjelobrojnih podataka.
- Dodajte element 0 vektoru vec.
- Dodajte element 1 vektoru vec.
- Komentar. Preskočit će ga C++ kompajler.
- Upotrijebite naredbu try za hvatanje iznimke. { označava početak tijela bloka try/catch. Kôd dodan unutar tijela postat će zaštićeni kod.
- Pokušajte pristupiti elementu pohranjenom na indeksu 2 (treći element) vektora pod nazivom vec. Ovaj element ne postoji.
- Kraj tijela try/catch bloka.
- Uhvatite iznimku. Vraćena poruka o pogrešci bit će pohranjena u varijabli ex.
- Ispišite neku poruku na konzoli ako se uhvati iznimka.
- Kraj tijela zahvatnog bloka.
- Program bi trebao vratiti vrijednost nakon uspješnog izvođenja.
- Kraj tijela funkcije main().
Primjer 2:
#include <iostream> using namespace std; double zeroDivision(int x, int y) { if (y == 0) { throw "Division by Zero!"; } return (x / y); } int main() { int a = 11; int b = 0; double c = 0; try { c = zeroDivision(a, b); cout << c << endl; } catch (const char* message) { cerr << message << endl; } return 0; }
Izlaz:
Evo snimke zaslona koda:
Objašnjenje koda:
- Uključite iostream datoteku zaglavlja u program da biste koristili njegove funkcije.
- Uključite prostor imena std u program u njegove klase bez njegovog pozivanja.
- Napravite funkciju pod nazivom zeroDivision koja uzima dva cijela argumenta, x i y. Funkcija bi trebala vratiti dvostruki rezultat.
- Koristite if naredbu da provjerite je li vrijednost varijable argumenta y 0. { označava početak if tijela.
- Poruka koja se vraća/izbacuje ako je y 0.
- Kraj tijela naredbe if.
- Funkcija zeroDivision trebala bi vratiti vrijednost x/y.
- Kraj tijela funkcije zeroDivision.
- Pozovite metodu main(). { označava početak ove metode.
- Deklarirajte cjelobrojnu varijablu i dodijelite joj vrijednost 11.
- Deklarirajte cjelobrojnu varijablu b i dodijelite joj vrijednost 0.
- Deklarirajte dvostruku varijablu c i dodijelite joj vrijednost 0.
- Upotrijebite naredbu try za hvatanje iznimke. { označava početak tijela bloka try/catch. Kôd dodan unutar tijela postat će zaštićeni kod.
- Pozovite funkciju zeroDivision i prijeđite na argumente a i b, odnosno 11 i 0. Rezultat ove operacije bit će pohranjen u varijabli c.
- Ispišite vrijednost varijable c na konzoli.
- Kraj tijela try/catch bloka.
- Uhvatite iznimku. Vraćena poruka o pogrešci bit će pohranjena u varijabli poruka.
- Ispišite vraćenu poruku o pogrešci na konzoli.
- Kraj tijela zahvatnog bloka.
- Program bi trebao vratiti vrijednost nakon uspješnog izvođenja.
- Kraj tijela funkcije main().
C++ Standardne iznimke
C++ dolazi s popisom standardnih iznimaka definiranih u razreda. One su opisane u nastavku:
izuzetak | Description |
---|---|
std::iznimka | Ovo je iznimka i roditeljska klasa svih standarda C++ iznimke. |
std::bad_alloc | Ovu iznimku izbacuje nova ključna riječ. |
std::bad_cast | Ovo je iznimka koju izbacuje dynamic_cast. |
std::bad_exception | Koristan uređaj za rukovanje neočekivanim iznimkama u C++ Programi. |
std::bad_typeid | Iznimka koju je izbacio typeid. |
std::logička_pogreška | Ova se iznimka teoretski može otkriti čitanjem koda. |
std::domain_error | Ovo je iznimka koja se javlja nakon korištenja matematički nevažeće domene. |
std::nevažeći_argument | Bačena iznimka zbog upotrebe nevažećih argumenata. |
std::length_error | Iznimka bačena nakon stvaranja velikog std::stringa. |
std::izvan_raspona | Bačen metodom. |
std::runtime_error | Ovo je iznimka koja se ne može otkriti čitanjem koda. |
std::overflow_greška | Ova se iznimka izbacuje nakon pojave matematičkog preljeva. |
std::pogreška_raspona | Ova se iznimka javlja kada pokušate pohraniti vrijednost izvan raspona. |
std::underflow_greška | Iznimka koja se javlja nakon pojave matematičkog pretoka. |
Korisnički definirane iznimke
Korištenje električnih romobila ističe C++ std::exception klasa nam omogućuje da definiramo objekte koji se mogu izbaciti kao iznimke. Ova je klasa definirana u zaglavlje. Klasa nam daje virtualnu funkciju članicu pod nazivom what.
Ova funkcija vraća niz znakova tipa char * koji završava nulom. Možemo ga prebrisati u izvedenim klasama da bismo imali opis iznimke.
Primjer:
#include <iostream> #include <exception> using namespace std; class newException : public exception { virtual const char* what() const throw() { return "newException occurred"; } } newex; int main() { try { throw newex; } catch (exception& ex) { cout << ex.what() << '\n'; } return 0; }
Izlaz:
Evo snimke zaslona koda:
Objašnjenje koda:
- Uključite iostream datoteku zaglavlja u naš program. Koristit ćemo njegove funkcije bez dobivanja pogrešaka.
- Uključite datoteku zaglavlja iznimke u naš program. Koristit ćemo njegove funkcije kako god bez grešaka.
- Uključite prostor imena std u naš program kako biste koristili njegove klase bez pozivanja.
- Napravite novu klasu pod nazivom newException. Ova klasa nasljeđuje klasu izuzetaka od C++.
- Početak klasnog tijela.
- Prebrišite virtualnu funkciju člana what() definiranu u datoteci zaglavlja iznimke. Zatim ćemo opisati našu vlastitu iznimku, novu iznimku.
- Započnite definiciju nove iznimke.
- Poruka koja se vraća ako se uhvati nova iznimka.
- Kraj definicije nove iznimke.
- Kraj tijela klase newException. Newex je naziv koji se koristi za hvatanje naše nove iznimke, nakon čega će se pozvati newException.
- Pozovite funkciju main(). Programsku logiku treba dodati unutar njegovog tijela. { označava početak njegovog tijela.
- Koristite naredbu try za označavanje koda unutar kojeg trebamo označiti iznimku. { označava početak tijela bloka try/catch. Šifra okružena time postat će zaštićena.
- Izbaci newex iznimku ako je uhvaćena.
- Kraj tijela pokušaja.
- Upotrijebite naredbu catch da uhvatite iznimku. Poruka o pogrešci izuzetka bit će pohranjena u varijabli ex.
- Ispišite poruku o pogrešci izuzetka na konzoli.
- Kraj tijela izjave o ulovu.
- Program bi trebao vratiti vrijednost ako se uspješno izvrši.
- Kraj tijela funkcije main().
rezime
- S izuzetkom rukovanja u C++, možete rješavati pogreške tijekom izvođenja.
- Runtime error su pogreške koje se javljaju tijekom izvođenja programa.
- Rukovanje iznimkama pomaže vam u rješavanju bilo kakvih neočekivanih okolnosti u vašem programu.
- Kada se dogodi neočekivana okolnost, kontrola programa se prenosi na rukovatelje.
- Da biste uhvatili iznimku, stavite dio koda ispod bloka try-catch.
- Ključna riječ throw pomaže programu da izbaci iznimke, pomažući programu da riješi problem.
- Ključna riječ try pomaže identificirati blok koda za koji će se aktivirati određene iznimke.
- Možemo prebrisati funkciju what() datoteke zaglavlja iznimke kako bismo definirali naše iznimke.