Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Seminář C++ 10. cvičení Obsluha výjimek Ing. Jan Mikulka.

Podobné prezentace


Prezentace na téma: "Seminář C++ 10. cvičení Obsluha výjimek Ing. Jan Mikulka."— Transkript prezentace:

1 Seminář C++ 10. cvičení Obsluha výjimek Ing. Jan Mikulka

2 Ošetřování výjimek ► zpracování chyb ► umožňuje oddělit kód programu od kódu zpracování chyb – větší přehlednost ► knihovní funkce nemusí zpracovávat chyby, stačí vyvolat výjimku a zpracování chyby nechat na volající program ► nemusí se měnit syntaxe funkce - výhoda např. u konstruktorů,...

3 Schéma použití výjimek try { // pokusny blok // pokusny blok } catch(typ[identifikator]) { // telo handleru // telo handleru } ► handler (nebo více handlerů) musí bezprostředně navazovat na pokusný blok ► typ – datový typ proměnné, která nese informaci o výjimce ► identifikátor – proměnná nesoucí informaci o výjimce

4 Vyvolání výjimky ► klíčové slovo throw ► výjimka smí vzniknout jen v pokusném bloku

5 Neočekávané a neošetřené výjimky ► systém volá funkci terminate() v případě, že je třeba ukončit program ► terminate() je volána v případě absence vhodného handleru na vyvolanou výjimku, ta standardně volá funkci abort() ► voláním funkce set_terminate() můžeme předepsat funkci, kterou funkce terminate() bude volat místo abort(). Tato funkce by měla ukončit program!

6 Příklad ošetření dynamické alokace void* AlokujPamet(int size){ void* ptr; void* ptr; ptr = malloc((size_t) size; ptr = malloc((size_t) size; if (ptr==0) throw("nepodarilo se alokovat pamet"); if (ptr==0) throw("nepodarilo se alokovat pamet"); return ptr; return ptr;} int main(){ try{ try{ AlokujPamet(100); AlokujPamet(100); } catch(char* v){ catch(char* v){ printf("%s\n", v); printf("%s\n", v); }}

7 Příklad ošetření dělení nulou (a) class Zlomek {private: int C,J; public: void nastavCitatel(int c) { C = c;} void nastavJmenovatel(int j) {J = j;} double vydel() throw (Vyjimka) { if (J == 0) if (J == 0) { string s("Nulou delit nelze..."); string s("Nulou delit nelze..."); Vyjimka v(s); Vyjimka v(s); throw v; throw v; } return ((double)C / J); return ((double)C / J); }};

8 Příklad ošetření dělení nulou (b) class Vyjimka { /* Třída výjimek */ private: string Duvod; public: Vyjimka(string s) Vyjimka(string s) { Duvod = s; Duvod = s; } string hlaska() { return Duvod; } };

9 Příklad ošetření dělení nulou (c) ostream &operator<< (ostream &os, Vyjimka &v) { return os << v.hlaska() << endl; } int main(int argc, char* argv[]) { Zlomek z; Zlomek z;z.nastavCitatel(5); for(int i = 5; i > -5; i--) {z.nastavJmenovatel(i);try {/* Zkusim: */ cout << "5 / " << i << " = " << z.vydel() << endl; } catch (Vyjimka v) // Zde je odchycení výjimky tøídy Vyjimka { cout << v << endl; cout << v << endl;}} getchar(); getchar(); return 0; return 0;}

10 Zadání cvičení ► Napište šablonovou třídu: template class LIFO, která bude sloužit jako last-in-first-out zásobník. Třída bude obsahovat funkce Add(T) pro přidání prvku, T Get() pro odebrání prvku. Obě funkce vyvolají výjimku v případě pokusu o odebrání prvku z prázdného zásobníku, popř. pokusu o přidání prvku do plného zásobníku. V hlavním programu vytvořte instanci třídy LIFO a v nekonečném cyklu náhodně přidávejte / odebírejte náhodné prvky. Obslužte výjimky. ► program umístěte do samostatného hlavičkového souboru, nakreslete vývojový diagram ► ► použití nového „cout <<“ místo „printf()“ ► použití new a delete ► bodování: funkce (1 bod), rychlost (1 bod), stabilita a délka prog. (1 bod), implementace v hl. souboru (1 bod)

11 Výstup programu


Stáhnout ppt "Seminář C++ 10. cvičení Obsluha výjimek Ing. Jan Mikulka."

Podobné prezentace


Reklamy Google