Wyjątki

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