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:
Code Magyarázat:
- 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:
Code Magyarázat:
- 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
Az 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:
Code Magyarázat:
- 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íti a programot a kivételek dobásában, helping a programot a probléma kezelésére.
- 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.




