Przypomnienie:
try { int a=1; throw a; } catch(int b) { // wyjatek typu int } catch(...) { // wszystkie wyjatki }
W pliku nagłówkowym wyjatki.h
zadeklaruj klasy wyjątków: Wyjatek
, ZlyIndeksWektora
i BrakPamieci
i dodaj do szablonu klasy Wektor polecenia rzucające obiekty tych klas w razie zaistnienia sytuacji wyjątkowych.
Wyjatek
, stanowi ogólną klasę wyjątków po której będą dziedziczyły wszystkie inne typy wyjątków. Klasa ta zawiera:throw Wyjatek(„Pojawil sie nieoczekiwany blad!”)
. Komunikat()
zwracająca tekst komunikatu. ZlyIndeksWektora
dziedziczy po klasie Wyjatek
. Przykład użycia dla klasy Wektor:
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; } catch(...) { cout << "Wystapil nieznany wyjatek\n"; }
BrakPamieci
dziedziczy po klasie Wyjątek
. 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"; }
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";
BrakPamieci
i ZlyIndeksWektora
dziedziczą po klasie Wyjatek
, więc:Komunikat()
zwracając tekst odpowiednio sformatowany z zależności od sytuacji (od typu obiektu).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"; }