C ++

Spracovanie výnimiek v C ++

Spracovanie výnimiek v C ++
Existujú tri typy softvérových chýb. Jedná sa o chyby syntaxe, logické chyby a chyby za behu.

Syntaxové chyby

Nesprávne zadaný výraz, výrok alebo konštrukcia sú syntaktickou chybou.

Zvážte nasledujúce dve tvrdenia:

int arr [] = 1, 2, 3; // správne
int arr = 1, 2, 3; // chyba syntaxe, chýba []

Sú to definície toho istého poľa. Prvý je správny. V druhom chýba [], a to je syntaktická chyba. Program s chybou syntaxe sa nepodarilo zostaviť. Kompilácia zlyhá s chybovou správou označujúcou chybu syntaxe. Dobrá vec je, že syntaktická chyba sa dá vždy opraviť, ak programátor vie, čo robí.

Logická chyba

Logická chyba je chyba spáchaná programátorom, keď sa vytvorí nesprávne logické kódovanie. Môže to byť dôsledok nevedomosti programátora o vlastnostiach programovacieho jazyka alebo nepochopenia toho, čo by mal program robiť.

V tejto situácii je program úspešne zostavený. Program funguje dobre, ale vytvára nesprávne výsledky. Takáto chyba môže byť spôsobená tým, že smyčka bude iterovaná 5-krát, keď bude vykonaná iterácia 10-krát. Môže sa tiež stať, že je vedome vytvorená slučka na nekonečné opakovanie. Jediným spôsobom, ako vyriešiť tento druh chyby, je vykonať dôkladné programovanie a program dôkladne otestovať pred jeho odovzdaním zákazníkovi.

Chyby za behu

Chybné alebo výnimočné vstupy spôsobujú chyby za behu. V takom prípade bol program úspešne zostavený a funguje dobre v mnohých situáciách. V určitých situáciách program zlyhá (a zastaví sa).

Predstavte si, že v segmente programového kódu musí byť 8 vydelený počtom menovateľov. Ak je teda čitateľ 8 vydelený menovateľom 4, odpoveď (kvocient) bude 2. Ak však používateľ zadá ako menovateľ 0, program by zlyhal. Delenie 0 nie je v matematike povolené a takisto nie je povolené ani vo výpočtovej technike. V programovaní by sa malo zabrániť deleniu na nulu. Spracovanie výnimiek spracováva chyby za behu, ako napríklad rozdelenie na nulu. Nasledujúci program ukazuje, ako zvládnuť problém rozdelenia na nulu bez použitia funkcie výnimky v C ++:

#include
pomocou namespace std;
int main ()

int čitateľ = 8;
menovateľ int = 2;
ak (menovateľ != 0)

int výsledok = čitateľ / menovateľ;
cout << result << '\n';

inak

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

návrat 0;

Výstup je 4. Keby bol menovateľ 0, výstup by bol:

"Delenie nulou nie je povolené."!“

Hlavný kód je tu konštrukcia typu if-else. Ak menovateľ nie je 0, dôjde k rozdeleniu; ak je 0, k rozdeleniu nedôjde. Chybové hlásenie sa odošle používateľovi a program bude pokračovať bez zlyhania. Chyby za behu sa zvyčajne riešia tak, že sa zabráni vykonaniu segmentu kódu a pošle sa používateľovi chybová správa.

Funkcia výnimky v C ++ používa blok try pre blok if a blok catch pre blok else na spracovanie chyby, a to nasledovne:

#include
pomocou namespace std;
int main ()

int čitateľ = 8;
menovateľ int = 2;
skús

ak (menovateľ != 0)

int výsledok = čitateľ / menovateľ;
cout << result << '\n';

inak

hod 0;


chytiť (int err)

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

návrat 0;

Upozorňujeme, že hlavička try nemá argument. Všimnite si tiež, že catch-block, ktorý je ako definícia funkcie, má parameter. Typ parametra musí byť rovnaký ako operand (argument) výrazu throw. Výraz vhadzovania je v bloku pokusov. Vrhá argument podľa výberu programátora, ktorý súvisí s chybou, a modul catch-block ju zachytí. Týmto spôsobom sa kód v try-bloku nevykoná. Blok catch potom zobrazí chybové hlásenie.

Tento článok vysvetľuje spracovanie výnimiek v jazyku C++. Základné vedomosti v C ++ sú predpokladom pre čitateľa na pochopenie tohto článku.

Obsah článku:

  • Funkcia vyvoláva výnimku
  • Viac ako jeden úlovok na jeden pokus o blokovanie
  • Vnorené bloky pokusu / chytenia
  • noexcept-specifikátor
  • Špeciálna funkcia std :: terminate ()
  • Záver

Funkcia vyvolaná výnimkou:

Funkcia môže tiež vyvolať výnimku, rovnako ako blok try. Vrhanie sa uskutočňuje v rámci definície funkcie. Nasledujúci program to ilustruje:

#include
pomocou namespace std;
void fn (const char * str)

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

int main ()

skús

fn („kováč“);

chytiť (char ch)

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

návrat 0;

Všimnite si, že tentokrát má blok try iba volanie funkcie. Je to volaná funkcia, ktorá má operáciu hodu. Blok catch zachytáva výnimku a výstup je:

"Meno osoby nemôže začínať malými písmenami."!“

Tentokrát je vyhodeným a chyteným typom zuhoľnatený.

Viac ako jeden úlovok na jeden pokus o blokovanie:

Pre jeden pokusný blok môže byť viac ako jeden chytací blok. Predstavte si situáciu, že vstupom môže byť akýkoľvek znak klávesnice, ale nie číslica a abeceda. V takom prípade musia existovať dva záchytné bloky: jeden pre celé číslo na kontrolu číslice a jeden pre znak na kontrolu abecedy. Ilustruje to nasledujúci kód:

#include
pomocou namespace std;
char input = '*';
int main ()

skús

if (isdigit (vstup))
hod 10;
if (izalpha (vstup))
hod 'z';

chytiť (int)

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

úlovok (znak)

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

návrat 0;

Nie je k dispozícii žiadny výstup. Ak bola hodnota vstupu číslica, napr.g., „1“, výstup by bol:

„Zadávanie číslic je zakázané!„

Ak bola hodnota vstupu abeceda, napr.g., „a“, výstup by bol:

"Zadávanie znakov je zakázané!„

Upozorňujeme, že v zozname parametrov dvoch blokov catch nie je uvedený žiadny identifikátor. Upozorňujeme tiež, že pri definovaní dvoch blokov úlovkov neboli overené konkrétne hodené argumenty, či sú ich hodnoty presné alebo nie.

Pre úlovok je dôležitý typ; úlovok sa musí zhodovať s typom vrhaného operandu. Konkrétna hodnota hodeného argumentu (operandu) sa môže v prípade potreby použiť na ďalšie overenie.

Viac ako jeden manipulátor pre rovnaký typ

Je možné, že budú mať dvaja spracovatelia rovnakého typu. Keď je vyvolaná výnimka, ovládací prvok sa prenesie na najbližšiu obslužnú rutinu s typom zhody. Nasledujúci program to ilustruje:

#include
pomocou namespace std;
char vstup = '1';
int main ()

skús

if (isdigit (vstup))
hod 10;

chytiť (int)

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

chytiť (int)

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

návrat 0;

Výstup je:

„Zadávanie číslic je zakázané!„

Vnorené bloky pokusu a chytenia:

bloky try / catch môžu byť vnorené. Vyššie uvedený program na zadávanie nealfanumerických znakov z klávesnice sa tu opakuje, ale s vnoreným abecedným chybovým kódom:

#include
pomocou namespace std;
char input = '*';
int main ()

skús

if (isdigit (vstup))
hod 10;
skús

if (izalpha (vstup))
hod 'z';

úlovok (znak)

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


chytiť (int)

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

návrat 0;

Chybný abecedný blok pokusu / chytenia je vnorený do bloku pokusu číselného kódu. Fungovanie tohto programu a predchádzajúce operácie, z ktorých sa kopíruje, sú rovnaké.

noexcept-specifikátor

Zvážte nasledujúcu funkciu:

void fn (const char * str) noexcept

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

Všimnite si špecifikátor 'noexcept' hneď za pravou zátvorkou zoznamu funkčných parametrov. To znamená, že funkcia by nemala spôsobiť výnimku. Ak funkcia vyvolá výnimku, ako v tomto prípade, zostaví sa s varovnou správou, ale nespustí sa. Pokus o spustenie programu zavolá špeciálnu funkciu std :: terminate (), ktorá by mala program ladne zastaviť namiesto toho, aby umožňovala jeho doslova zlyhanie.

Špecifikátor noexcept je v rôznych formách. Sú to tieto:

typ func () noexcept; : neumožňuje výraz hodu
typ func () noexcept (true); : umožňuje výraz hodu
type func () throw (); : neumožňuje výraz hodu
typ func () noexcept (false); : umožňuje výraz hodu, ktorý je voliteľný
typ func (); : umožňuje výraz hodu, ktorý je voliteľný

true alebo false v zátvorkách možno nahradiť výrazom, ktorého výsledkom je true alebo false.

Špeciálna funkcia std :: terminate ():

Ak sa s výnimkou nedá zaobchádzať, mala by sa vyhodiť znova. V tomto prípade vyhodený výraz môže alebo nemusí mať operand. Špeciálna funkcia std :: terminate () sa bude volať za behu, čo by malo program ladne zastaviť namiesto toho, aby umožňovalo jeho doslova zlyhanie.

Zadajte, kompilujte a spustite nasledujúci program:

#include
pomocou namespace std;
char vstup = '1';
int main ()

skús

if (isdigit (vstup))
hod 10;

chytiť (int)

hod;

návrat 0;

Po úspešnej kompilácii sa program ukončil bez spustenia a chybové hlásenie z počítača autora je:

„Ukončenie volané po vyhodení inštancie 'int'

Aborted (core dumpinged) “

Záver:

Funkcia výnimky v C ++ zabraňuje vykonaniu segmentu kódu na základe nejakého druhu vstupu. Program sa naďalej vykonáva podľa potreby. Konštrukt výnimky (prevencia chýb) pozostáva z bloku try a bloku catch. Try-block má záujmový segment kódu, ktorý je možné obísť, v závislosti od niektorých vstupných podmienok. Try-block má výraz throw, ktorý hodí operand. Tento operand sa nazýva aj výnimka. Ak sú typ operandu a typ parametra bloku zachytávania rovnaké, potom sa zachytí výnimka (spracuje sa). Ak sa výnimka nezachytí, program bude ukončený, ale stále buďte v bezpečí, pretože sa nevykonal segment kódu, ktorý sa mal vykonať, aby poskytol nesprávny výsledok. Typické spracovanie výnimiek znamená obídenie segmentu kódu a odoslanie chybovej správy používateľovi. Segment kódu sa vykoná pre normálny vstup, ale pre nesprávny vstup sa obíde.

Hry Ako používať GameConqueror Cheat Engine v Linuxe
Ako používať GameConqueror Cheat Engine v Linuxe
Tento článok obsahuje sprievodcu používaním cheatovacieho modulu GameConqueror v systéme Linux. Mnoho používateľov, ktorí hrajú hry v systéme Windows,...
Hry Najlepšie emulátory herných konzol pre systém Linux
Najlepšie emulátory herných konzol pre systém Linux
V tomto článku je uvedený zoznam populárneho softvéru na emuláciu herných konzol, ktorý je k dispozícii pre systém Linux. Emulácia je vrstva kompatibi...
Hry Najlepšie linuxové distribúcie pre hry v roku 2021
Najlepšie linuxové distribúcie pre hry v roku 2021
Operačný systém Linux prešiel dlhou cestou od svojho originálneho, jednoduchého serverového vzhľadu. Tento OS sa za posledné roky nesmierne vylepšil a...