Wyjątki

Przypomnienie:

try { int a=1; throw a; } catch(int b) { // wyjatek typu int } catch(...) { // wszystkie wyjatki }

Wyjatkowe sytuacje klasy Wektor

W pliku nagłówkowym wyjatki.h zadeklaruj klasy wyjątków: ZlyIndeksWektora, BrakPamieci i Wyjatek.

ZlyIndeksWektora rzucany gdy podamy zły indeks tablicy. Klasa zawiera publiczne pole typu całkowitego inicjowane przez konstruktor, przechowyjące wartość złego indeksu.

try { //Wektor<int> a(-1); // zly indeks Wektor<int> b(100); for(int i=0;i<30;i++) b.Dodaj(i); // b[-1] = 2; // zly indeks b[29] = 2; // b[30] = 2; // zly indeks cout << "Nie wystapil zaden wyjatek" << endl; } catch(ZlyIndeksWektora w) { cout << "Wystapil wyjatek [zly indeks]: " << "Wartosc indeksu " << w.indeks << endl; }

BrakPamieci rzucamy gdy zabraknie pamięci przy zwiększaniu wektora.

try { int rozmiar = 1; while(1) { cout << "Rozmiar: " << rozmiar << " kB" << endl; Wektor<char> c(rozmiar*1024); // w koncu zabraknie pamieci rozmiar*=2; } cout << "Nie wystapil zaden wyjatek" << endl; } catch(BrakPamieci w) { cout << "Wyjatek [brak pamieci] " << endl; }catch(...) { cout << "Wystapil nieznany wyjatek\n"; }
W zależności od configuracji, operator new w przypadku wystąpienia błędu może także rzucać wyjątek. Można temu zapobiec wymuszając aby w przypadku błędu operator ten zwracał NULL.

Przykład:

#include <new.h> int *a = new(std::nothrow) int[1]; if(a==0) throw "Brak pamieci";

Wyjatek ogólna klasa wyjątków zawierająca:

pole chronione przechowujące komunikat o błędzie (string).
Komunikat ustawiany jest przez konstruktor, np. : throw Wyjatek(„Pojawil sie nieoczekiwany blad!”).

metodę publiczną Komunikat() zwracająca tekst komunikatu.

Niech klasy BrakPamieci i ZlyIndeksWektora

dziedziczą po klasie Wyjatek

przeciążają odpowiednie konstruktory pozwalające dodać komunikat o błędzie przy tworzeniu obiektu

zasłaniają metodę Komunikat() zwracając tekst odpowiednio sformatowany z zależności od sytuacji

Przykładowy kod testowy:

try { //Wektor<int> a(-1); // zly indeks Wektor<int> b(100); for(int i=0;i<30;i++) b.Dodaj(i); // b[-1] = 2; // zly indeks b[29] = 2; // b[30] = 2; // zly indeks int rozmiar=1; while(1) { cout << "Rozmiar: " << rozmiar << " kB" << endl; Wektor<char> c(rozmiar*1024); // w koncu zabraknie pamieci rozmiar*=2; } cout << "Nie wystapil zaden wyjatek" << endl; } catch(Wyjatek &w) { w.Komunikat() ; } catch(BrakPamieci &w) { w.Komunikat(); } catch(ZlyIndeksWektora &w) { w.Komunikat(); } catch(...) { cout << "Wystapil nieznany wyjatek\n"; }