C ++

Zpracování výjimek v C ++

Zpracování výjimek v C ++
Existují tři typy softwarových chyb. Jedná se o chyby syntaxe, logické chyby a chyby za běhu.

Chyby syntaxe

Chybně zadaný výraz, prohlášení nebo konstrukce je syntaktická chyba.

Zvažte následující dvě tvrzení:

int arr [] = 1, 2, 3; //opravit
int arr = 1, 2, 3; // chyba syntaxe, chybí []

Jsou to definice stejného pole. První je správný. Druhý chybí [], a to je syntaktická chyba. Program s chybou syntaxe se nepodařilo zkompilovat. Kompilace selže s chybovou zprávou označující chybu syntaxe. Dobrá věc je, že syntaktická chyba může být vždy opravena, pokud programátor ví, co dělá.

Logická chyba

Logická chyba je chyba spáchaná programátorem, když dojde k chybnému logickému kódování. Může to být důsledek nevědomosti programátora o vlastnostech programovacího jazyka nebo nepochopení toho, co by měl program dělat.

V této situaci je program úspěšně zkompilován. Program funguje dobře, ale produkuje špatné výsledky. Taková chyba může být způsobena provedením iterace smyčky 5krát, když je provedena iterace 10krát. Může se také stát, že je nevědomky vytvořena smyčka, která bude nekonečně iterovat. Jediným způsobem, jak vyřešit tento druh chyby, je pečlivé programování a důkladné otestování programu před jeho předáním zákazníkovi.

Chyby za běhu

Chybné nebo výjimečné vstupy způsobují chyby za běhu. V tomto případě byl program úspěšně zkompilován a funguje dobře v mnoha situacích. V určitých situacích program havaruje (a zastaví se).

Představte si, že v segmentu programového kódu musí být 8 rozděleno počtem jmenovatelů. Pokud je tedy čitatel 8 rozdělen jmenovatelem 4, odpověď (kvocient) bude 2. Pokud však uživatel zadá jako jmenovatel 0, program by selhal. Dělení 0 není v matematice povoleno a není povoleno ani ve výpočtech. V programování by mělo být zabráněno dělení na nulu. Zpracování výjimek zpracovává chyby za běhu, jako je dělení na nulu. Následující program ukazuje, jak zvládnout problém dělení na nulu bez použití funkce výjimky v C ++:

#zahrnout
pomocí jmenného prostoru std;
int main ()

int čitatel = 8;
jmenovatel int = 2;
if (jmenovatel != 0)

int výsledek = čitatel / jmenovatel;
cout << result << '\n';

jiný

cout << "Division by zero is not permitted!" << '\n';

návrat 0;

Výstup je 4. Pokud byl jmenovatel 0, výstup by byl:

"Rozdělení nulou není povoleno."!“

Hlavní kód je konstrukt if-else. Pokud jmenovatel není 0, dojde k rozdělení; pokud je 0, rozdělení se neuskuteční. Uživateli bude zaslána chybová zpráva a program bude pokračovat v chodu bez selhání. Chyby za běhu se obvykle řeší tak, že se zabrání provedení segmentu kódu a odešle se chybová zpráva uživateli.

Funkce výjimky v C ++ používá try-block pro if-block a catch-block pro else-block ke zpracování chyby, a to následujícím způsobem:

#zahrnout
pomocí jmenného prostoru std;
int main ()

int čitatel = 8;
jmenovatel int = 2;
Snaž se

if (jmenovatel != 0)

int výsledek = čitatel / jmenovatel;
cout << result << '\n';

jiný

hod 0;


chytit (int err)

if (err == 0)
cout << "Division by zero is not permitted!" << '\n';

návrat 0;

Všimněte si, že hlavička try nemá argument. Všimněte si také, že catch-block, který je jako definice funkce, má parametr. Typ parametru musí být stejný jako operand (argument) vrhacího výrazu. Výraz hodu je v bloku try. Vyvolá argument volby programátora, který souvisí s chybou, a catch-block ji zachytí. Tímto způsobem se kód v try-bloku neprovede. Blok catch poté zobrazí chybovou zprávu.

Tento článek vysvětluje zpracování výjimek v jazyce C++. Základní znalosti v C ++ jsou předpokladem pro to, aby čtenář porozuměl tomuto článku.

Obsah článku:

  • Funkce vyvolání výjimky
  • Více než jeden úlovek pro jeden pokus o blok
  • Vnořené bloky pro pokus / úlovek
  • specifikátor noexcept
  • Speciální funkce std :: terminate ()
  • Závěr

Funkce vyvolání výjimky:

Funkce může také vyvolat výjimku, stejně jako to dělá try-block. Vrhání probíhá v rámci definice funkce. Ilustruje to následující program:

#zahrnout
pomocí jmenného prostoru std;
void fn (const char * str)

if (islower (str [0]))
hod 'l';

int main ()

Snaž se

fn („kovář“);

chytit (char ch)

if (ch == 'l')
cout << "Person's name cannot begin in lowercase!" << '\n';

návrat 0;

Všimněte si, že tentokrát má blok try právě volání funkce. Jedná se o volanou funkci, která má operaci hodu. Blok catch zachytí výjimku a výstup je:

"Jméno osoby nemůže začínat malými písmeny."!“

Tentokrát je hodeným a chyceným typem char.

Více než jeden úlovek pro jeden pokus:

Pro jeden try-block může být více než jeden catch-block. Představte si situaci, kdy vstupem může být kterýkoli ze znaků klávesnice, ale ne číslice a abeceda. V tomto případě musí existovat dva záchytné bloky: jeden pro celé číslo pro kontrolu číslice a jeden pro znak pro kontrolu abecedy. Následující kód to ilustruje:

#zahrnout
pomocí jmenného prostoru std;
char input = '*';
int main ()

Snaž se

if (isdigit (vstup))
hod 10;
if (isalpha (input))
hod 'z';

chytit (int)

cout << "Digit input is forbidden!" << '\n';

chytit (char)

cout << "Character input is forbidden!" << '\n';

návrat 0;

Neexistuje žádný výstup. Pokud by hodnota vstupu byla číslice, např.G., '1', výstup by byl:

"Zadávání číslic je zakázáno!"

Pokud byla hodnota vstupu abeceda, např.G., 'a', výstup by byl:

"Zadávání znaků je zakázáno!"

Všimněte si, že v seznamu parametrů dvou bloků catch není název identifikátoru. Všimněte si také, že v definici dvou bloků úlovků nebyly ověřeny konkrétní vyvolané argumenty, zda jsou jejich hodnoty přesné nebo ne.

Pro úlovek je důležitý typ; úlovek musí odpovídat typu vyvolaného operandu. Konkrétní hodnotu hodeného argumentu (operandu) lze v případě potřeby použít pro další ověření.

Více než jeden manipulátor pro stejný typ

Je možné mít dva manipulátory stejného typu. Když je vyvolána výjimka, ovládací prvek se přenese na nejbližší obslužnou rutinu s odpovídajícím typem. Ilustruje to následující program:

#zahrnout
pomocí jmenného prostoru std;
char vstup = '1';
int main ()

Snaž se

if (isdigit (vstup))
hod 10;

chytit (int)

cout << "Digit input is forbidden!" << '\n';

chytit (int)

cout << "Not allowed at all: digit input!" << '\n';

návrat 0;

Výstupem je:

"Zadávání číslic je zakázáno!"

Vnořené bloky pokusu / chycení:

bloky try / catch mohou být vnořeny. Výše uvedený program pro zadávání nealfanumerických znaků z klávesnice se zde opakuje, ale s vnořeným abecedním chybovým kódem:

#zahrnout
pomocí jmenného prostoru std;
char input = '*';
int main ()

Snaž se

if (isdigit (vstup))
hod 10;
Snaž se

if (isalpha (input))
hod 'z';

chytit (char)

cout << "Character input is forbidden!" << '\n';


chytit (int)

cout << "Digit input is forbidden!" << '\n';

návrat 0;

Chybový abecední try / catch-block je vnořený do try-bloku digitálního kódu. Provoz tohoto programu a předchozí operace, ze které je zkopírován, jsou stejné.

specifikátor noexcept

Zvažte následující funkci:

void fn (const char * str) noexcept

if (islower (str [0]))
hod 'l';

Všimněte si specifikátoru 'noexcept' hned za pravou závorkou seznamu parametrů funkce. To znamená, že funkce by neměla vyvolávat výjimku. Pokud funkce vyvolá výjimku, jako v tomto případě, bude kompilována s varovnou zprávou, ale nebude spuštěna. Pokus o spuštění programu zavolá speciální funkci std :: terminate (), která by měla program ladně zastavit, místo aby mu umožnila doslova havarovat.

Specifikátor noexcept je v různých formách. Jedná se o následující:

zadejte func () noexcept; : neumožňuje výraz hodu
zadejte func () noexcept (true); : umožňuje výraz hodu
zadejte func () throw (); : neumožňuje výraz hodu
zadejte func () noexcept (false); : umožňuje výraz hodu, který je volitelný
typ func (); : umožňuje vrhací výraz, který je volitelný

true nebo false v závorkách lze nahradit výrazem, jehož výsledkem je true nebo false.

Funkce Special std :: terminate ():

Pokud výjimku nelze zpracovat, měla by být znovu vyvolána. V tomto případě vyvolaný výraz může nebo nemusí mít operand. Speciální funkce std :: terminate () bude volána za běhu, což by mělo program ladně zastavit, místo aby mu umožnilo doslova havarovat.

Zadejte, zkompilujte a spusťte následující program:

#zahrnout
pomocí jmenného prostoru std;
char vstup = '1';
int main ()

Snaž se

if (isdigit (vstup))
hod 10;

chytit (int)

házet;

návrat 0;

Po úspěšné kompilaci byl program ukončen bez spuštění a chybová zpráva z počítače autora je:

„Ukončení zavoláno po vyvolání instance 'int'

Aborted (core dumpinged) “

Závěr:

Funkce výjimky v C ++ brání spuštění segmentu kódu na základě nějakého druhu vstupu. Program pokračuje podle potřeby. Konstrukce výjimky (prevence chyb) se skládá z bloku try a bloku catch. Try-block má sledovaný segment kódu, který lze obejít, v závislosti na některých vstupních podmínkách. Try-block má výraz throw, který vyvolá operand. Tento operand se také nazývá výjimka. Pokud jsou typ operandu a typ parametru bloku zachycení stejné, pak je výjimka zachycena (zpracována). Pokud výjimka není zachycena, program bude ukončen, ale přesto buďte v bezpečí, protože segment kódu, který měl být proveden, aby poskytl nesprávný výsledek, nebyl proveden. Typické zpracování výjimek znamená obejití segmentu kódu a odeslání chybové zprávy uživateli. Segment kódu je proveden pro normální vstup, ale vynechán pro nesprávné vstupy.

Hry Nejlepší hry z příkazového řádku pro Linux
Nejlepší hry z příkazového řádku pro Linux
Příkazový řádek není při používání Linuxu jen vaším největším spojencem - může být také zdrojem zábavy, protože jej můžete použít k hraní mnoha zábavn...
Hry Nejlepší aplikace pro mapování gamepadu pro Linux
Nejlepší aplikace pro mapování gamepadu pro Linux
Pokud rádi hrajete hry na Linuxu s gamepadem místo typického vstupního systému pro klávesnici a myš, máte k dispozici několik užitečných aplikací. Mno...
Hry Užitečné nástroje pro hráče Linuxu
Užitečné nástroje pro hráče Linuxu
Pokud rádi hrajete hry na Linuxu, je pravděpodobné, že jste ke zlepšení herního zážitku použili aplikace a nástroje jako Wine, Lutris a OBS Studio. Kr...