Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 1 Kivételkezelés a C++ nyelvben Bevezetés Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék.

Hasonló előadás


Az előadások a következő témára: "Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 1 Kivételkezelés a C++ nyelvben Bevezetés Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék."— Előadás másolata:

1 Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 1 Kivételkezelés a C++ nyelvben Bevezetés Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék

2 Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 2 Hagyományos hibakezelés Függvény visszatérési értéke (paramétere) hátrányai: –azonosítás –hibaérték / valódi érték –hívási hierarchia! globális változó C++: hibastátusz adattag és visszaadó függvény Ellenőrzés nehézkes, sok helyre kell beiktatni. Kód áttekinthetőségét rontja!

3 Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 3 Kivétel fogalma Nem azonos az operációs rendszer exeption fogalmával. Kivétel az, amit programozó annak tekint. A C++ szemléletében a kivétel egy objektum, ami a kivétel bekövetkezésekor jön létre. Kivétel kiváltása: throw

4 Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 4 A kivételek kezelése try blokk: a "védett" programrészt fogja közre. try { utasítások } catch blokk(ok): a keletkezett kivételek lekezelése catch (típus paraméter) {utasítások} vagy catch ( típus ) vagy catch (... )

5 Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 5 Egyszerű példa 1. try { //utasítások char* szoveg = new char[200]; if ( szoveg == 0 ) throw "nincs memória"; //további utasítások }

6 Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 6 Egyszerű példa 2. catch ( char* uzenet ) { cout << uzenet << '\n'; //további utasítások az adott //állapot (most hiba) lekezelésére }

7 Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 7 Működés 1. az első throw utasítással befejeződik a try blokk végrehajtása kilép a blokkból a vezérlés, rendcsinálással –verem visszaállítása –lokális objektumok megszüntetése létrejön a throw utasításban megjelölt objektum egy példánya

8 Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 8 Működés 2. megkeresi a program azt az első catch blokkot, amely a kivétel objektumra illeszkedik (az illeszkedés fogalmát később pontosítjuk) végrehajtja a blokk utasításait a catch blokk végrehajtása után az utolsó catch blokk utáni első utasításra kerül a vezérlés ha kivétel keletkezett, de egy catch blokk sem illeszkedett, a terminate függvény hívódik meg, ami leállítja a programot

9 Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 9 Egymásba ágyazott kivételkezelők A try blokkok egymásba ágyazhatók explicit, vagy implicit módon (pl. függvényhívás) A catch blokkok keresése (és a verem visszagombolyítása) "belülről kifelé" történik. Ha verem visszagombolyítás közben újabb kivétel keletkezik, a terminate függvény hívódik meg A kivétel lekezelése (vagy annak egy része) továbbhárítható a feljebb álló szintekre a paraméter nélküli throw utasítással.

10 Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 10 Leszármaztatott kivétel osztályok Mivel a kivétel egy objektum, kivétel osztályok között lehetséges leszármazási hierarchiát létrehozni, és ezzel csoportosítani a kivételeket. Egy E kivételobjektum illeszkedik a cath (H) blokkra, ha –H és E típusa azonos –H egy egyértelmű bázisosztálya E-nek –H és E pointerek és alaptípusukra a fenti érvényes –H egy referencia, és a hivatkozott típusra az első két pont valamelyike érvényes

11 Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 11 Általános catch blokk Formája: catch (... ) Erre a blokkra bármilyen kivétel objektum illeszkedik, tehát logikusan csak az utolsó lehet a blokkok sorában. Használhatjuk arra, hogy minden egyéb, speciális kezelés nem igénylő kivételt itt kezeljünk le. Gyakran végződik a kivétel továbbdobásával.

12 Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 12 class AllocError { int meret; public: AllocError(int m) {meret = m;} void uzenet(void) { cerr << meret << "byte lefoglalasa sikertelen" << "\n"; } };

13 Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 13 class Vektor { int n; int* p; public: class RangeError; Vektor(int hatar); int& operator[] (int i); };

14 Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 14 class Vektor::RangeError { int index; public: RangeError(void) {index = 0;}; RangeError (int i) {index=i; } void uzenet(void) { cerr<< "Hibas index: " << index << "\n";} };

15 Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 15 Vektor::Vektor(int hatar) { n = hatar; p = new int[n]; if (p == 0) throw AllocError(n*sizeof(int)); }

16 Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 16 int& Vektor::operator[] (int i) { if (i >= 0 && i < n) return p[i]; throw RangeError(i); }

17 Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 17 int main(int argc, char* argv[]) { try { Vektor v(100); v[100] = 5; } catch (AllocError error) { error.uzenet(); } catch (Vektor::RangError r) { r.uzenet(); } return 0; }


Letölteni ppt "Ficsor Lajos Kivételkezelés a C++ nyelvben CPP9 / 1 Kivételkezelés a C++ nyelvben Bevezetés Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék."

Hasonló előadás


Google Hirdetések