C++ Kivételkezelés: Próbáld ki, fogd el, dobd el Példa
Mi az a kivételkezelés? C++?
Kivételkezelés C++ lehetőséget biztosít a váratlan körülmények, például a futásidejű hibák kezelésére. Így minden váratlan körülmény esetén a programvezérlés átkerül a kezelőknek nevezett speciális funkciókhoz.
A kivételek észleléséhez a kód egy részét kivételvizsgálat alá kell helyezni. A kód szakasza a try-catch blokkon belül van elhelyezve.
Ha kivételes helyzet lép fel a kód adott szakaszán belül, kivételt dob a rendszer. Ezután a kivételkezelő veszi át a program irányítását.
Ha nem történik kivételes körülmény, a kód a szokásos módon fog lefutni. A kezelőket figyelmen kívül hagyjuk.
Ebben C++ oktatóanyag, megtudhatja:
Miért a kivételkezelés?
Íme, miért használja a kivételkezelést C++:
- A hibakezelési kódot elkülöníti a normál kódtól. A kód olvashatóbb és könnyebben karbantartható lesz.
- A függvények képesek kezelni az általuk választott kivételeket. Még ha egy függvény sok kivételt is dob, csak néhányat kezel. A hívó fél kezeli a nem elkapott kivételeket.
Kivételkezelési kulcsszavak
Kivételkezelés C++ ez a három kulcsszó körül forog:
- dobás– Ha egy program problémába ütközik, kivételt dob. A dobás kulcsszó segít a programnak a dobás végrehajtásában.
- fogás– egy program kivételkezelőt használ a kivételek elkapására. Hozzáadjuk a program azon részéhez, ahol kezelni kell a problémát. Ez a catch kulcsszó használatával történik.
- megpróbál– a try blokk azonosítja azt a kódblokkot, amelyre bizonyos kivételek aktiválódnak. Utána egy/több elkapó blokknak kell lennie.
Tegyük fel, hogy egy kódblokk kivételt okoz. A kivételt a try and catch kulcsszavakat használó módszer fogja el. A try/catch blokknak olyan kódot kell körülírnia, amely kivételt okozhat. Az ilyen kódot védett kódnak nevezik.
Szintaxis
A try/catch a következő szintaxist veszi fel:
try { // the protected code } catch( Exception_Name exception1 ) { // catch block } catch( Exception_Name exception2 ) { // catch block } catch( Exception_Name exceptionN ) { // catch block }
- Habár van egy try (próbálkozás) kijelentésünk, sok fogási állításunk lehet.
- Az ExceptionName az elkapandó kivétel neve.
- A kivétel1, kivétel2 és kivételN az Ön által meghatározott nevek a kivételekre való hivatkozáshoz.
Példa 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; }
output:
Itt van egy képernyőkép a kódról:
Kód magyarázata:
- Szerelje be az iostream fejlécfájlt a programba a használatához funkciók.
- Szerelje be a vektorfejléc fájlt a programba a funkcióinak használatához.
- A programban szereplő std névteret az osztályaiba foglalja bele anélkül, hogy meghívná.
- Hívja meg a main() függvényt. A program logikáját hozzá kell adni a törzséhez.
- Hozzon létre egy vec nevű vektort egész számok tárolására.
- Adjuk hozzá a 0 elemet a vec nevű vektorhoz.
- Adjuk hozzá a 1 elemet a vec nevű vektorhoz.
- Egy komment. Kihagyja a C++ fordítóprogram.
- Használja a try utasítást a kivételek elkapásához. A { a try/catch blokk törzsének kezdetét jelöli. A törzsben hozzáadott kód lesz a védett kód.
- Próbálja meg elérni a vec nevű vektor 2. indexén (harmadik elemén) tárolt elemet. Ez az elem nem létezik.
- A try/catch blokk törzsének vége.
- Fogd meg a kivételt. A visszaadott hibaüzenet az ex változóban tárolódik.
- Nyomtasson ki valamilyen üzenetet a konzolon, ha a kivételt elkapják.
- A rögzítőblokk testének vége.
- Sikeres végrehajtás után a programnak értéket kell visszaadnia.
- A main() függvénytörzs vége.
Példa 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; }
output:
Itt van egy képernyőkép a kódról:
Kód magyarázata:
- Szerelje be az iostream fejlécfájlt a programba a funkcióinak használatához.
- A programban szereplő std névteret az osztályaiba foglalja bele anélkül, hogy meghívná.
- Hozzon létre egy zeroDivision nevű függvényt, amely két egész argumentumot vesz fel: x és y. A függvénynek dupla eredményt kell visszaadnia.
- Használjon if utasítást annak ellenőrzésére, hogy az y változó argumentuma értéke 0. Az { az if test kezdetét jelöli.
- A visszaadandó/dobandó üzenet, ha y értéke 0.
- Az if utasítás törzsének vége.
- A zeroDivision függvénynek az x/y értékét kell visszaadnia.
- A zeroDivision függvény törzsének vége.
- Hívja meg a main() metódust. A { a metódus kezdetét jelzi.
- Deklaráljunk egy egész változót, és adjunk hozzá 11 értéket.
- Deklaráljunk egy b egész változót, és adjunk hozzá 0 értéket.
- Deklaráljunk egy c kettős változót, és adjunk neki 0 értéket.
- Használja a try utasítást a kivételek elkapásához. A { a try/catch blokk törzsének kezdetét jelöli. A törzsben hozzáadott kód lesz a védett kód.
- Hívja meg a zeroDivision függvényt, majd adja át az a és b argumentumokat, azaz a 11-et és a 0-t. A művelet eredménye a c változóban lesz tárolva.
- Nyomtassa ki a c változó értékét a konzolon.
- A try/catch blokk törzsének vége.
- Fogd meg a kivételt. A visszaadott hibaüzenet a változó üzenetben tárolódik.
- Nyomtassa ki a visszaküldött hibaüzenetet a konzolon.
- A rögzítőblokk testének vége.
- Sikeres végrehajtás után a programnak értéket kell visszaadnia.
- A main() függvénytörzs vége.
C++ Szabványos kivételek
C++ tartalmazza a szabványos kivételek listáját osztály. Ezeket az alábbiakban ismertetjük:
kivétel | Leírás |
---|---|
std:: kivétel | Ez kivétel, és minden szabvány szülőosztálya C++ kivételek. |
std::bad_alloc | Ezt a kivételt egy új kulcsszó okozza. |
std::bad_cast | Ez egy kivétel, amelyet a dynamic_cast dob. |
std::bad_exception | Hasznos eszköz a váratlan kivételek kezelésére C++ programokat. |
std::rossz_típusazonosító | A typeid által dobott kivétel. |
std::logikai_hiba | Ez a kivétel elméletileg kódolvasással észlelhető. |
std::domain_error | Ez a kivétel matematikailag érvénytelen domain használata után. |
std::invalid_argument | Kivétel érvénytelen argumentumok használatáért. |
std::length_error | Kivétel egy nagy std::string létrehozása után. |
std::tartományon kívül | Metódussal dobta. |
std::runtime_error | Ez egy kivétel, amely nem észlelhető a kód beolvasásával. |
std::túlcsordulás_hiba | Ez a kivétel matematikai túlcsordulás fellépése után jelenik meg. |
std::tartomány_hiba | Ez a kivétel akkor jelenik meg, ha egy tartományon kívüli értéket próbál meg tárolni. |
std::underflow_error | Kivétel a matematikai alulcsordulás előfordulása után. |
Felhasználó által meghatározott kivételek
A C++ Az std::exception osztály lehetővé teszi, hogy olyan objektumokat definiáljunk, amelyek kivételként dobhatók fel. Ezt az osztályt a fejléc. Az osztály egy what nevű virtuális tagfüggvényt biztosít számunkra.
Ez a függvény null-végződésű char * típusú karaktersorozatot ad vissza. A származtatott osztályokban felülírhatjuk, hogy kivételleírásunk legyen.
Példa:
#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; }
output:
Itt van egy képernyőkép a kódról:
Kód magyarázata:
- Szerelje be az iostream fejlécfájlt a programunkba. A funkcióit hiba nélkül fogjuk használni.
- Szerelje be a kivételfejléc fájlt a programunkba. Hiba nélkül fogjuk használni a funkcióit, mint amit.
- Szerelje be az std névteret a programunkba, hogy az osztályait hívás nélkül használhassa.
- Hozzon létre egy új osztályt newException néven. Ez az osztály örökli a kivételosztályt C++.
- Az osztálytest kezdete.
- Írja felül a what() virtuális tagfüggvényt, amelyet a kivételfejlécfájlban definiált. Ezután leírjuk a saját kivételünket, az új kivételt.
- Kezdje el az új kivétel meghatározását.
- Az új kivétel elkapása esetén visszaküldendő üzenet.
- Az új kivétel meghatározásának vége.
- Az osztály törzsének vége newException. A newex az új kivételünk elkapására szolgáló név, amely után a newException név lesz.
- Hívja meg a main() függvényt. A program logikáját hozzá kell adni a törzséhez. A { testének kezdetét jelzi.
- Használjon try utasítást annak a kódnak a megjelölésére, amelyen belül meg kell jelölnünk a kivételt. A { a try/catch blokk törzsének kezdetét jelöli. Az ezzel körülvett kód védetté válik.
- Dobd el a newex kivételt, ha elkapják.
- A próbatest vége.
- A kivétel elkapásához használja a catch utasítást. A kivétel hibaüzenet az ex változóban tárolódik.
- Nyomtassa ki a kivétel hibaüzenetét a konzolon.
- A fogási nyilatkozat törzsének vége.
- A programnak értéket kell visszaadnia, ha sikeresen fut.
- A main() függvény törzsének vége.
Összegzésként
- A kezelés kivételével C++, kezelheti a futásidejű hibákat.
- A futásidejű hibák azok a hibák, amelyek a program végrehajtása során fordulnak elő.
- A kivételkezelés segít kezelni a programban előforduló váratlan körülményeket.
- Amikor a váratlan körülmény bekövetkezik, a programvezérlés átkerül a kezelőkre.
- Kivétel elkapásához el kell helyeznie egy kódrészletet a try-catch blokk alá.
- A throw kulcsszó segít a programnak kivételeket dobni, segítve a programot a probléma kezelésében.
- A try kulcsszó segít azonosítani azt a kódblokkot, amelyre bizonyos kivételek aktiválódnak.
- Felülírhatjuk a kivételfejléc fájl what() függvényét a kivételek meghatározásához.