C++ Zpracování výjimek: Příklad zkuste, chyťte, hoďte

V čem je zpracování výjimek C++?

Zpracování výjimek v C++ vám poskytuje způsob, jak zvládnout neočekávané okolnosti, jako jsou chyby za běhu. Takže kdykoli nastane neočekávaná okolnost, řízení programu se přenese na speciální funkce známé jako handlery.

Chcete-li zachytit výjimky, umístíte určitou část kódu pod kontrolu výjimek. Část kódu je umístěna v bloku try-catch.

Pokud v této části kódu nastane výjimečná situace, bude vyvolána výjimka. Dále obslužná rutina výjimky převezme kontrolu nad programem.

Pokud nenastanou žádné výjimečné okolnosti, kód se spustí normálně. Obslužné osoby budou ignorovány.

V tomto C++ tutoriál, naučíte se:

Proč zpracování výjimek?

Zde jsou důvody pro použití zpracování výjimek v C++:

  • Oddělíte svůj kód zpracování chyb od běžného kódu. Kód bude čitelnější a snadnější na údržbu.
  • Funkce zvládnou výjimky, které si vyberou. I když funkce vyvolá mnoho výjimek, zpracuje jen některé. Volající vyřídí nezachycené výjimky.

Klíčová slova pro zpracování výjimek

Zpracování výjimek v C++ se točí kolem těchto tří klíčových slov:

  • hod– když program narazí na problém, vyvolá výjimku. Klíčové slovo throw pomáhá programu provést hod.
  • úlovek– program používá obsluhu výjimky k zachycení výjimky. Je přidán do části programu, kde potřebujete vyřešit problém. Provádí se pomocí klíčového slova catch.
  • vyzkoušet– blok try identifikuje blok kódu, pro který budou aktivovány určité výjimky. Po něm by měl následovat jeden/více záchytných bloků.

Předpokládejme, že blok kódu vyvolá výjimku. Výjimka bude zachycena metodou využívající klíčová slova try and catch. Blok try/catch by měl obklopovat kód, který může vyvolat výjimku. Takový kód je známý jako chráněný kód.

Syntax

Try/catch má tuto syntaxi:

try {
   // the protected code
} catch( Exception_Name exception1 ) {
   // catch block
} catch( Exception_Name exception2 ) {
   // catch block
} catch( Exception_Name exceptionN ) {
   // catch block
}
  • Přestože máme jeden příkaz try, můžeme mít mnoho příkazů catch.
  • ExceptionName je název výjimky, která má být zachycena.
  • Výjimka1, výjimka2 a výjimkaN jsou vámi definované názvy pro odkazování na výjimky.

Příklad 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;
}

Výstup:

Klíčová slova pro zpracování výjimek

Zde je snímek obrazovky kódu:

Klíčová slova pro zpracování výjimek

Vysvětlení kódu:

  1. Chcete-li jej použít, zahrňte do programu hlavičkový soubor iostream funkce.
  2. Chcete-li používat jeho funkce, zahrňte do programu soubor vektorové hlavičky.
  3. Zahrňte jmenný prostor std v programu do jeho tříd, aniž byste jej volali.
  4. Zavolejte funkci main(). Logika programu by měla být přidána do jeho těla.
  5. Vytvořte vektor s názvem vec pro ukládání celočíselných dat.
  6. Přidejte prvek 0 do vektoru s názvem vec.
  7. Přidejte prvek 1 do vektoru s názvem vec.
  8. Komentář. Bude přeskočeno C++ kompilátor.
  9. K zachycení výjimky použijte příkaz try. { označuje začátek těla bloku try/catch. Kód přidaný do těla se stane chráněným kódem.
  10. Pokuste se získat přístup k prvku uloženému na indexu 2 (třetí prvek) vektoru s názvem vec. Tento prvek neexistuje.
  11. Konec těla bloku try/catch.
  12. Chyť výjimku. Vrácená chybová zpráva bude uložena v proměnné ex.
  13. Pokud je výjimka zachycena, vytiskněte na konzole nějakou zprávu.
  14. Konec těla záchytného bloku.
  15. Program by měl po úspěšném spuštění vrátit hodnotu.
  16. Konec těla funkce main().

Příklad 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;
}

Výstup:

Klíčová slova pro zpracování výjimek

Zde je snímek obrazovky kódu:

Klíčová slova pro zpracování výjimek

Vysvětlení kódu:

  1. Chcete-li používat jeho funkce, zahrňte do programu hlavičkový soubor iostream.
  2. Zahrňte jmenný prostor std v programu do jeho tříd, aniž byste jej volali.
  3. Vytvořte funkci s názvem zeroDivision, která přebírá dva celočíselné argumenty x a y. Funkce by měla vrátit dvojitý výsledek.
  4. Pomocí příkazu if zkontrolujte, zda je hodnota proměnné argument y 0. Znak { označuje začátek těla if.
  5. Zpráva, která má být vrácena/vyhozena, pokud y je 0.
  6. Konec těla příkazu if.
  7. Funkce zeroDivision by měla vrátit hodnotu x/y.
  8. Konec těla funkce zeroDivision.
  9. Zavolejte metodu main(). { označuje začátek této metody.
  10. Deklarujte celočíselnou proměnnou a přiřaďte jí hodnotu 11.
  11. Deklarujte celočíselnou proměnnou b a přiřaďte jí hodnotu 0.
  12. Deklarujte dvojitou proměnnou c a přiřaďte jí hodnotu 0.
  13. K zachycení výjimky použijte příkaz try. { označuje začátek těla bloku try/catch. Kód přidaný do těla se stane chráněným kódem.
  14. Volání funkce zeroDivision a předání argumentům a a b, tedy 11 a 0. Výsledek této operace bude uložen do proměnné c.
  15. Vytiskněte hodnotu proměnné c na konzole.
  16. Konec těla bloku try/catch.
  17. Chyť výjimku. Vrácená chybová zpráva bude uložena do proměnné zprávy.
  18. Vytiskněte vrácenou chybovou zprávu na konzole.
  19. Konec těla záchytného bloku.
  20. Program by měl po úspěšném spuštění vrátit hodnotu.
  21. Konec těla funkce main().

C++ Standardní výjimky

C++ Standardní výjimky

C++ přichází se seznamem standardních výjimek definovaných v třída. Tyto jsou popsány níže:

Výjimka Description
std::výjimka Toto je výjimka a rodičovská třída všech standardů C++ výjimky.
std::bad_alloc Tato výjimka je vyvolána novým klíčovým slovem.
std::bad_cast Toto je výjimka vyvolaná dynamic_cast.
std::bad_exception Užitečné zařízení pro zpracování neočekávaných výjimek v C++ programy.
std::bad_typeid Výjimka vyvolaná typeid.
std::logic_error Tato výjimka je teoreticky zjistitelná čtením kódu.
std::chyba_domény Toto je výjimka vyvolaná po použití matematicky neplatné domény.
std::invalid_argument Výjimka vyvolaná pro použití neplatných argumentů.
std::length_error Výjimka vyvolaná po vytvoření velkého std::string.
std::out_of_range Hodí metodou.
std::runtime_error Toto je výjimka, kterou nelze zjistit čtením kódu.
std::overflow_error Tato výjimka je vyvolána po výskytu matematického přetečení.
std::chyba_rozsahu Tato výjimka je vyvolána, když se pokusíte uložit hodnotu mimo rozsah.
std::underflow_error Výjimka vyvolaná po výskytu matematického podtečení.

Uživatelsky definované výjimky

Jedno C++ Třída std::exception nám umožňuje definovat objekty, které mohou být vyvolány jako výjimky. Tato třída byla definována v záhlaví. Třída nám poskytuje virtuální členskou funkci s názvem what.

Tato funkce vrací sekvenci znaků typu char * ukončenou nulou. Můžeme jej přepsat v odvozených třídách, abychom měli popis výjimky.

Příklad:

#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;	
}

Výstup:

Uživatelsky definované výjimky

Zde je snímek obrazovky kódu:

Uživatelsky definované výjimky

Vysvětlení kódu:

  1. Zahrňte do našeho programu hlavičkový soubor iostream. Budeme používat jeho funkce bez chyb.
  2. Zahrňte do našeho programu hlavičkový soubor výjimky. Budeme používat jeho funkce jako co bez chyb.
  3. Zahrňte do našeho programu jmenný prostor std, abyste mohli používat jeho třídy bez jeho volání.
  4. Vytvořte novou třídu s názvem newException. Tato třída dědí třídu výjimky C++.
  5. Začátek těla třídy.
  6. Přepište virtuální členskou funkci what() definovanou v souboru záhlaví výjimky. Poté popíšeme naši vlastní výjimku, novou výjimku.
  7. Spusťte definici nové výjimky.
  8. Zpráva, která má být vrácena, pokud je zachycena nová výjimka.
  9. Konec definice nové výjimky.
  10. Konec těla třídy newException. Newex je název, který se použije k zachycení naší nové výjimky, po které bude volána newException.
  11. Zavolejte funkci main(). Logika programu by měla být přidána do jeho těla. { označuje začátek jeho těla.
  12. Pomocí příkazu try označte kód, ve kterém musíme označit výjimku. { označuje začátek těla bloku try/catch. Kód obklopený tímto bude chráněn.
  13. Vyhoďte výjimku newex, pokud je chycena.
  14. Konec zkušebního těla.
  15. K zachycení výjimky použijte příkaz catch. Chybová zpráva výjimky bude uložena v proměnné ex.
  16. Vytiskněte chybovou zprávu o výjimce na konzole.
  17. Konec těla příkazu catch.
  18. Pokud se program úspěšně spustí, měl by vrátit hodnotu.
  19. Konec těla funkce main().

Shrnutí

  • S výjimkou zpracování v C++, můžete zvládnout chyby za běhu.
  • Runtime chyby jsou chyby, ke kterým dochází během provádění programu.
  • Zpracování výjimek vám pomůže zvládnout jakékoli neočekávané okolnosti ve vašem programu.
  • Když nastane neočekávaná okolnost, řízení programu se přenese na handlery.
  • Chcete-li zachytit výjimku, umístíte část kódu pod blok try-catch.
  • Klíčové slovo throw pomáhá programu házet výjimky a pomáhá programu vyřešit problém.
  • Klíčové slovo try pomáhá identifikovat blok kódu, pro který budou aktivovány určité výjimky.
  • Můžeme přepsat funkci what() hlavičkového souboru výjimky a definovat naše výjimky.

Shrňte tento příspěvek takto: