======= 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 a(-1); // zly indeks
Wektor 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 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
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 a(-1); // zly indeks
Wektor 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 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";
}