|
|||||||||||||||||||||||||||||||||||||||||||||||||
Menu
Distributions (131)
bootable [55]
commercial [7] no-commercial [42] unclassified [20] [7]
Software (10844)
|
C++ výjimkyV tomto článku je vysvětleno zpracování výjimek v jazyce C++. Je tedy popsáno, co to vlastně výjimka je a jak ji lze zachytit.
Dále je v článku popsáno, co se stane, když se výjimka nezachytí a nechybí ani krátká zmínka o úniku paměti.
Jak již samotný název napovídá, výjimka bude něco, co se nestává příliš často, ale stát se to může. V programování se výjimkou rozumí nějaká neočekávaná událost, která může vést i ke zhroucení samotného programu. Pravděpodobně nejčastějším příkladem, na jakém se začínají vysvětlovat výjimky, je dělení nulou. Dejme tomu, že v našem programu očekáváme od uživatele zadání dvou čísel, které následně chceme mezi sebou vydělit. Když bude vše dle našeho očekávání, uživatel zadá například čísla 6 a 3, program vypočte podíl, vrátí číslo 2 a vše je jak má být. Problém nastane, pokud jako druhé číslo zadá nulu. To je pro nás výjimečná situace, neboť nulou dělit nelze. Proto je třeba tuto možnost ohlídat, aby nedošlo ke zhroucení programu. K tomuto účelu slouží právě výjimky.
Princip výjimek spočivá v tom, že část kódu, ve kterém může nastat výjimka, uzavřeme do bloku
throw . To slouží k vyvolání výjimky, čili pokud je b rovno nule,
pomocí throw se vyhodí výjimka "Deleni nulou" a program přejde na blok catch , který očekává konstantní
znakový ukazatel. Podotýkám, že použití mechanismu výjimek není v tomto případě nijak zvlášť nutné, neboť přímo tento případ
by bylo jednodušší ošetřit prostou podmínkou, ale příklad slouží jako ukázka. Samozřejmostí je, že při psaní programů mohou nastat
i jiné výjimky, než jen obyčejné dělení nulou. Může jich být opravdu mnoho, záleží především na povaze programu - problém může
nastat v případě, že se nelze připojit k FTP serveru, že není možné číst ze souboru, nelze alokovat paměť apod. Snahou programátora
by mělo být to, aby výjimky, které v jeho programu mohou nastat, co nejlépe ošetřil.
Vzhledem k tomu, že v programu většinou může dojít k více výjimkám, je možné napsat více bloků
catch , a blok catch (...) dát až jako poslední, jako takový "záložní".
Výjimky mohou být také součástí tříd. Můžeme tedy vytvořit jiný typ objektu pro různé výjimky, které budeme chtít zachytit,
přičemž samotný objekt může nést informace, týkající se vzniklého problému. Jestliže se výjimka, kterou chceme odchytit, vztahuje
na něco, co se děje v nějaké třídě, bývá vhodné definovat typ výjimky jako vnořenou třídu. Pro jednoduchost můžeme uvažovat, že
máme třídu
MyStructure , společně s vnořenou třídou WrongIndex je k dispozici
zde. Za zmínku ještě stojí, že
ve výjimkách lze vytvořit jakousi "hierarchii" pomocí dědičnosti. Není tedy žádný problém vytvořit třídu výjimky, která bude
dědit například z třídy WrongIndex . Stejně tak vytvoříme-li třídu, která bude dědit ze třídy MyStructure ,
tak tato nová třída zdědí i třídu WrongIndex .
Co se stane, když se výjimka nezachytí
Jak jsem již výše psal, nastane-li v programu něco neočekávaného, často tato situace vede k ukončení programu. Podívejme se
na to ale trochu podrobněji. Nezachycená výjimka totiž nezpůsobí okamžité ukončení programu. Místo toho nejprve v programu dojde k
zavolání funkce
b rovna nule, dojde k vyvolání výjimky. V programu ale není žádný odpovídající
blok catch , který by výjimku ošetřil. Proto se zavolá funkce terminate() , která zavolá naší funkci
myFunction . Co dělá tato funkce už není třeba komentovat.
Únik pamětiNyní již víme, k čemu výjimky slouží a jak se používají. Nicméně tak jako všechno ostatní, tak i výjimky mají své nevýhody. S jejich použitím se zvětšuje velikost výsledného programu a program se stává o něco pomalejším. Výjimky si také příliš dobře nerozumí se šablonami, neboť šablony funkcí mohou vyvolávat různé výjimky v závislosti na konkrétní specializaci. Někdy také může nastat problém s dynamickou alokací paměti. V následující ukázce pochopíte, o čem mluvím.
myFunction vrátí logickou hodnotu false , vyvolá se výjimka
a řízení programu se předá odpovídajícímu bloku catch . Mimo to dojde k tomu, že ztratíme ukazatel p a
blok paměti, na níž ukazatel ukazoval, zůstane nepřístupný. Tomuto problému se říká únik paměti. Jak tomuto úniku předejít? Poměrně
jednoduše.
Related article
C/C++ (1) - Úvod C/C++ (2) - První program C/C++ (3) - Proměnné a konstanty C/C++ (4) - Funkce printf C/C++ (5) - Funkce printf podruhé C/C++ (6) - Operátory C/C++ (7) - Podmínka C/C++ (8) - Cykly C/C++ (9) - Pole C/C++ (10) - Standardní vstup a výstup C/C++ (11) - Čtení a konverze čísel C/C++ (12) - Preprocesor C/C++ (13) - Preprocesor podruhé C/C++ (14) - Funkce C/C++ (15) - Proměnné C/C++ (16) - Hlavičkové soubory C/C++ (17) - Makefile C/C++ (18) - Makefile podruhé C/C++ (19) - Příkaz switch a bitové operátory C/C++ (20) - Alokace paměti C/C++ (21) - Práce s řetězci C/C++ (22) - Struktury C/C++ (23) - Seznam C/C++ (24) - Soubory C/C++ (25) - Funkce s proměnným počtem parametrů C/C++ (26) - Standardní knihovna C/C++ (27) - Standardní knihovna podruhé C/C++ (28) - Standardní knihovna potřetí C/C++ (29) - Standardní knihovna počtvrté C/C++ (30) - Výčtový typ a nestandardní knihovny C/C++ (31) - Jazyk C++, historie, charakteristika, vztah k C C/C++ (32) - Omezení C++ oproti C C/C++ (33) - Rozdíly mezi C a C++ C/C++ (34) - Drobná vylepšení C++ C/C++ (35) - Reference, funkce C/C++ (36) - Prostory jmen C/C++ (37) - Prostory jmen podruhé C/C++ (38) - Prostory jmen potřetí C/C++ (39) - Objektově orientované programování C/C++ (40) - Dědičnost a virtuální metody GCC vs. CLANG C++ Binární vyhledávací stromy C++ Datová struktura zásobník C++ - Hashování C++ - Vyhledávání v textu - Brute Force algoritmus C++ šablony Grafy a grafové algoritmy I Grafy a grafové algoritmy II C++ Funktory neboli funkční objekty Grafy a grafové algoritmy III. C++ a garbage collector Previous Show category (serial) Next
|
Szukanie oprogramowania
|
|||||||||||||||||||||||||||||||||||||||||||||||
©Pavel Kysilka - 2003-2024 | maillinuxsoft.cz | Design: www.megadesign.cz |