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

⚡ Chytré shrnutí

Zpracování výjimek v C++ umožňuje programu detekovat a reagovat na chyby za běhu pomocí příkazů try, catch a throw, aby nedošlo k jeho pádu. Zde se dozvíte klíčová slova, syntaxi, standardní výjimky a uživatelsky definované výjimky s příklady.

  • ⚠️ Co to je: Ošetření výjimek zachycuje chyby za běhu, aby se program mohl zotavit.
  • 🔑 Klíčová slova: Používá try k testování kódu, throw k vyvolání a catch k ošetření chyb.
  • 🧾 Syntaxe: Vložte rizikový kód do bloku try a chyby ošetřete v blocích catch.
  • ???? Standardní výjimky: C++ poskytuje vestavěné výjimky v hlavičce výjimky.
  • 🤖 Pomoc s umělou inteligencí: Nástroje umělé inteligence, jako je GitHub Copilot, přidávají bloky try-catch a ošetřování chyb.

C++ Manipulace s výjimkami

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

Code Vysvětlení:

  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

Code Vysvětlení:

  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

Code Vysvětlení:

  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().

Nejčastější dotazy

Ošetření výjimek je způsob, jak detekovat a reagovat na chyby za běhu v C++ pomocí klíčových slov try, throw a catch, aby se program mohl obnovit, místo aby se zhroutil.

C++ používá tři klíčová slova: try zabalí kód, který by mohl selhat, throw vyvolá výjimku, když dojde k chybě, a catch zpracuje vyvolanou výjimku.

Umístěte rizikový kód do bloku try a poté za ním přidejte jeden nebo více bloků catch, z nichž každý zpracovává specifický typ výjimky vyvolané blokem try.

Standardní výjimky jsou vestavěné třídy výjimek v hlavičce výjimky, například std::bad_alloc a std::out_of_range, které hlásí běžné chyby za běhu.

Uživatelem definovaná výjimka je vlastní třída, často odvozená od std::exception, která přepíše funkci what() a popíše vaši vlastní specifickou chybovou podmínku.

Asistenti umělé inteligence, jako je GitHub Copilot, zabalují riskantní kód do bloků try-catch, generují vlastní třídy výjimek a při psaní navrhují, které výjimky zachytit.

Ano. Nástroje s umělou inteligencí odhalují neošetřené výjimky, navrhují specifické bloky zachycení namísto generických a přidávají smysluplné chybové zprávy, díky čemuž je vaše C++ robustnější kód.

Funkce throw vyvolá výjimku, když je detekována chyba, zatímco funkce catch tuto výjimku přijme a spustí kód, který chybu zpracuje nebo ohlásí.

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