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:
Zde je snímek obrazovky kódu:
Vysvětlení kódu:
- Chcete-li jej použít, zahrňte do programu hlavičkový soubor iostream funkce.
- Chcete-li používat jeho funkce, zahrňte do programu soubor vektorové hlavičky.
- Zahrňte jmenný prostor std v 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čeno C++ kompilátor.
- 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.
- 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.
- Konec těla bloku try/catch.
- Chyť výjimku. Vrácená chybová zpráva bude uložena v proměnné ex.
- Pokud je výjimka zachycena, vytiskněte na konzole nějakou zprávu.
- Konec těla záchytného bloku.
- Program by měl po úspěšném spuštění vrátit hodnotu.
- 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:
Zde je snímek obrazovky kódu:
Vysvětlení kódu:
- Chcete-li používat jeho funkce, zahrňte do programu hlavičkový soubor iostream.
- Zahrňte jmenný prostor std v 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é argument y 0. Znak { označuje začátek těla if.
- Zpráva, která má být vrácena/vyhozena, 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.
- 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.
- 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.
- Vytiskněte hodnotu proměnné c na konzole.
- Konec těla bloku try/catch.
- Chyť výjimku. Vrácená chybová zpráva bude uložena do proměnné zprávy.
- Vytiskněte vrácenou chybovou zprávu na konzole.
- Konec těla záchytného bloku.
- Program by měl po úspěšném spuštění vrátit hodnotu.
- Konec těla funkce main().
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:
Zde je snímek obrazovky kódu:
Vysvětlení kódu:
- Zahrňte do našeho programu hlavičkový soubor iostream. Budeme používat jeho funkce bez chyb.
- Zahrňte do našeho programu hlavičkový soubor výjimky. Budeme používat jeho funkce jako co bez chyb.
- Zahrňte do našeho programu jmenný prostor std, abyste mohli používat jeho třídy bez jeho volání.
- Vytvořte novou třídu s názvem newException. Tato třída dědí třídu výjimky C++.
- Začátek těla třídy.
- 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.
- Spusťte definici nové výjimky.
- Zpráva, která má být vrácena, pokud je zachycena nová výjimka.
- Konec definice nové výjimky.
- 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.
- 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.
- K zachycení výjimky použijte příkaz catch. Chybová zpráva výjimky bude uložena v proměnné ex.
- Vytiskněte chybovou zprávu o výjimce na konzole.
- Konec těla příkazu catch.
- Pokud se program úspěšně spustí, měl by vrátit hodnotu.
- 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.




