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ávneint 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 ++:
#includepomocou 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:
#includepomocou 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:
#includepomocou 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:
#includepomocou 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:
#includepomocou 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:
#includepomocou 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) noexceptif (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 hodutyp 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:
#includepomocou 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.