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:

Kivételkezelési kulcsszavak

Itt van egy képernyőkép a kódról:

Kivételkezelési kulcsszavak

Kód magyarázata:

  1. Szerelje be az iostream fejlécfájlt a programba a használatához funkciók.
  2. Szerelje be a vektorfejléc fájlt a programba a funkcióinak használatához.
  3. A programban szereplő std névteret az osztályaiba foglalja bele anélkül, hogy meghívná.
  4. Hívja meg a main() függvényt. A program logikáját hozzá kell adni a törzséhez.
  5. Hozzon létre egy vec nevű vektort egész számok tárolására.
  6. Adjuk hozzá a 0 elemet a vec nevű vektorhoz.
  7. Adjuk hozzá a 1 elemet a vec nevű vektorhoz.
  8. Egy komment. Kihagyja a C++ fordítóprogram.
  9. 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.
  10. 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.
  11. A try/catch blokk törzsének vége.
  12. Fogd meg a kivételt. A visszaadott hibaüzenet az ex változóban tárolódik.
  13. Nyomtasson ki valamilyen üzenetet a konzolon, ha a kivételt elkapják.
  14. A rögzítőblokk testének vége.
  15. Sikeres végrehajtás után a programnak értéket kell visszaadnia.
  16. 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:

Kivételkezelési kulcsszavak

Itt van egy képernyőkép a kódról:

Kivételkezelési kulcsszavak

Kód magyarázata:

  1. Szerelje be az iostream fejlécfájlt a programba a funkcióinak használatához.
  2. A programban szereplő std névteret az osztályaiba foglalja bele anélkül, hogy meghívná.
  3. 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.
  4. 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.
  5. A visszaadandó/dobandó üzenet, ha y értéke 0.
  6. Az if utasítás törzsének vége.
  7. A zeroDivision függvénynek az x/y értékét kell visszaadnia.
  8. A zeroDivision függvény törzsének vége.
  9. Hívja meg a main() metódust. A { a metódus kezdetét jelzi.
  10. Deklaráljunk egy egész változót, és adjunk hozzá 11 értéket.
  11. Deklaráljunk egy b egész változót, és adjunk hozzá 0 értéket.
  12. Deklaráljunk egy c kettős változót, és adjunk neki 0 értéket.
  13. 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.
  14. 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.
  15. Nyomtassa ki a c változó értékét a konzolon.
  16. A try/catch blokk törzsének vége.
  17. Fogd meg a kivételt. A visszaadott hibaüzenet a változó üzenetben tárolódik.
  18. Nyomtassa ki a visszaküldött hibaüzenetet a konzolon.
  19. A rögzítőblokk testének vége.
  20. Sikeres végrehajtás után a programnak értéket kell visszaadnia.
  21. A main() függvénytörzs vége.

C++ Szabványos kivételek

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:

Felhasználó által meghatározott kivételek

Itt van egy képernyőkép a kódról:

Felhasználó által meghatározott kivételek

Kód magyarázata:

  1. Szerelje be az iostream fejlécfájlt a programunkba. A funkcióit hiba nélkül fogjuk használni.
  2. Szerelje be a kivételfejléc fájlt a programunkba. Hiba nélkül fogjuk használni a funkcióit, mint amit.
  3. Szerelje be az std névteret a programunkba, hogy az osztályait hívás nélkül használhassa.
  4. Hozzon létre egy új osztályt newException néven. Ez az osztály örökli a kivételosztályt C++.
  5. Az osztálytest kezdete.
  6. Í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.
  7. Kezdje el az új kivétel meghatározását.
  8. Az új kivétel elkapása esetén visszaküldendő üzenet.
  9. Az új kivétel meghatározásának vége.
  10. 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.
  11. 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.
  12. 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.
  13. Dobd el a newex kivételt, ha elkapják.
  14. A próbatest vége.
  15. 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.
  16. Nyomtassa ki a kivétel hibaüzenetét a konzolon.
  17. A fogási nyilatkozat törzsének vége.
  18. A programnak értéket kell visszaadnia, ha sikeresen fut.
  19. 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.