Co je zpracování výjimek v C ++?
Zpracování výjimek v C ++ vám poskytuje způsob řešení neočekávaných okolností, jako jsou chyby za běhu. Takže kdykoli dojde k neočekávané situaci, ovládací prvek programu se přenese na speciální funkce známé jako obslužné rutiny.
Chcete-li zachytit výjimky, umístěte čá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 dojde k výjimečné situaci, bude vyvolána výjimka. Dále obslužný program výjimky převezme kontrolu nad programem.
V případě, že nenastanou žádné výjimečné okolnosti, kód se spustí normálně. Obslužné rutiny budou ignorovány.
V tomto výukovém programu C ++ se naučíte:
- Co je zpracování výjimek v C ++?
- Proč zpracování výjimek?
- Klíčová slova pro zpracování výjimek
- Syntax:
- Standardní výjimky C ++
- Uživatelem definované výjimky
Proč zpracování výjimek?
Tady jsou důvody pro použití zpracování výjimek v C ++:
- Oddělíte kód pro zpracování chyb od normálního kódu. Kód bude čitelnější a snadněji se udržuje.
- Funkce mohou zpracovat výjimky, které si vyberou. I když funkce vyvolá mnoho výjimek, zvládne pouze některé. Volající zpracuje 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:
- throw - když program narazí na problém, vyvolá výjimku. Klíčové slovo throw pomáhá programu provést throw.
- catch - program používá k zachycení výjimky obslužnou rutinu výjimky. Přidá se do části programu, kde je třeba problém vyřešit. Dělá se to pomocí klíčového slova catch.
- try - 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 bloků úlovku.
Předpokládejme, že blok kódu vyvolá výjimku. Výjimku zachytí metoda použí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 se nazývá 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}
- I když máme jeden příkaz try, můžeme mít mnoho příkazů catch.
- Název výjimky je název výjimky, která se má zachytit.
- The exception1, exception2, and exceptionN are your defined names for referring to the exceptions.
Příklad 1:
#include#include using namespace std;int main() {vector vec;vec.push_back(0);vec.push_back(1);// access the third element, which doesn't existtry{vec.at(2);}catch (exception& ex){cout << "Exception occurred!" << endl;}return 0;}
Výstup:
Zde je snímek obrazovky s kódem:
Vysvětlení kódu:
- Chcete-li používat jeho funkce, zahrňte do programu soubor záhlaví iostream.
- Chcete-li používat jeho funkce, zahrňte do programu vektorový záhlaví.
- Zahrňte standardní obor jmen do programu do jeho tříd, aniž byste jej volali.
- Zavolejte funkci main (). Logika programu by měla být přidána do jeho těla.
- Vytvořte vektor s názvem vec pro ukládání celočíselných dat.
- Přidejte prvek 0 do vektoru s názvem vec.
- Přidejte prvek 1 do vektoru s názvem vec.
- Komentář. Bude přeskočen kompilátorem C ++.
- Pomocí příkazu try můžete zachytit výjimku. {Označuje začátek těla bloku try / catch. Kód přidaný do těla se stane chráněným kódem.
- Zkuste získat přístup k prvku uloženému v indexu 2 (třetí prvek) vektoru s názvem vec. Tento prvek neexistuje.
- Konec těla bloku try / catch.
- Chyťte výjimku. Vrácená chybová zpráva bude uložena v proměnné ex.
- Pokud je výjimka chycena, vytiskněte na konzoli nějakou zprávu.
- Konec těla západkového bloku.
- Program by měl po úspěšném provedení vrátit hodnotu.
- Konec hlavního () funkčního těla.
Příklad 2:
#includeusing 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:
Zde je snímek obrazovky s kódem:
Vysvětlení kódu:
- Chcete-li používat jeho funkce, zahrňte do programu soubor záhlaví iostream.
- Zahrňte standardní obor jmen do programu do jeho tříd, aniž byste jej volali.
- 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.
- Pomocí příkazu if zkontrolujte, zda je hodnota proměnného argumentu y 0. {označuje začátek těla if.
- Zpráva, která má být vrácena / vyvolána, pokud y je 0.
- Konec těla příkazu if.
- Funkce zeroDivision by měla vrátit hodnotu x / y.
- Konec těla funkce zeroDivision.
- Zavolejte metodu main (). {Označuje začátek této metody.
- Deklarujte celočíselnou proměnnou a přiřaďte jí hodnotu 11.
- Deklarujte celočíselnou proměnnou b a přiřaďte jí hodnotu 0.
- Deklarujte dvojitou proměnnou c a přiřaďte jí hodnotu 0.
- Pomocí příkazu try můžete zachytit výjimku. {Označuje začátek těla bloku try / catch. Kód přidaný do těla se stane chráněným kódem.
- Zavolejte funkci zeroDivision a předejte argumentům a a b, tj. 11 a 0. Výsledek této operace bude uložen v proměnné c.
- Vytiskněte na konzole hodnotu proměnné c.
- Konec těla bloku try / catch.
- Chyťte výjimku. Vrácená chybová zpráva bude uložena v proměnné zprávě.
- Vytiskněte vrácenou chybovou zprávu na konzole.
- Konec těla západkového bloku.
- Program by měl po úspěšném provedení vrátit hodnotu.
- Konec hlavního () funkčního těla.
Standardní výjimky C ++
C ++ přichází se seznamem standardních výjimek definovaných ve třídě
Výjimka | Popis |
std :: výjimka | Toto je výjimka a nadřazená třída všech standardních výjimek C ++. |
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 programech C ++. |
std :: bad_typeid | Výjimka vyvolaná typem. |
std :: logic_error | Tuto výjimku lze teoreticky zjistit načtením kódu. |
std :: chyba_domény | Toto je výjimka vyvolaná po použití matematicky neplatné domény. |
std :: invalid_argument | Vyvolána výjimka pro použití neplatných argumentů. |
std :: length_error | Výjimka vyvolaná po vytvoření velkého std :: řetězce. |
std :: out_of_range | Metoda vyvolána 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 :: range_error | Tato výjimka je vyvolána při pokusu o uložení hodnoty mimo rozsah. |
std :: underflow_error | Výjimka vyvolaná po výskytu matematického podtečení. |
Uživatelem definované výjimky
Třída C ++ 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í
Tato funkce vrací sekvenci znaků s nulovým zakončením typu char *. Můžeme jej přepsat v odvozených třídách, abychom měli popis výjimky.
Příklad:
#include#include 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:
Zde je snímek obrazovky s kódem:
Vysvětlení kódu:
- Zahrňte soubor záhlaví iostream do našeho programu. Budeme používat jeho funkce bez chyb.
- Zahrňte soubor záhlaví výjimky do našeho programu. Budeme používat jeho funkce jako co bez chyb.
- Zahrňte do našeho programu standardní obor názvů, abyste mohli používat jeho třídy, aniž byste jej volali.
- Vytvořte novou třídu s názvem newException. Tato třída dědí třídu výjimek C ++.
- Začátek těla třídy.
- Přepsat virtuální členskou funkci what () definovanou v souboru záhlaví výjimky. Poté popíšeme naši vlastní výjimku, novou výjimku.
- Spusťte definici nové výjimky.
- Zpráva, která se má vrátit, pokud je zachycena nová výjimka.
- Konec definice nové výjimky.
- Konec těla třídy newException. Newex je název, který se má použít k zachycení naší nové výjimky, po které se zavolá newException.
- Zavolejte funkci main (). Logika programu by měla být přidána do jeho těla. {Označuje začátek jeho těla.
- 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.
- Vyhoďte výjimku newex, pokud je chycena.
- Konec zkušebního těla.
- Pomocí příkazu catch můžete zachytit výjimku. Chybová zpráva o výjimce bude uložena v proměnné ex.
- Na konzole vytiskněte chybovou zprávu o výjimce.
- Konec textu prohlášení o úlovku.
- Program by měl vrátit hodnotu, pokud se provede úspěšně.
- Konec těla funkce main ().
Souhrn:
- Díky zpracování výjimek v C ++ můžete zpracovat chyby za běhu.
- Chyby runtime 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ž dojde k neočekávané situaci, řízení programu se přenese na obslužné rutiny.
- Chcete-li zachytit výjimku, umístíte část kódu pod blok try-catch.
- Klíčové slovo throw pomáhá programu vyvolávat výjimky a pomáhá programu zvládnout 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 () souboru záhlaví výjimky, abychom definovali naše výjimky.