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
iZlyIndeksWektora
- 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"; }