Edytuj stronę Odnośniki Fold/unfold all ODT export Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić. ======= Wyjątki ======= **Przypomnienie:** <code c++> try { int a=1; throw a; } catch(int b) { // wyjatek typu int } catch(...) { // wszystkie wyjatki } </code> ===== 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. <code c++> 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; } </code> * ''**BrakPamieci**'' rzucamy gdy zabraknie pamięci przy zwiększaniu wektora. <code c++> 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"; } </code> <note important>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. </note> Przykład:\\ <code c++> #include <new.h> int *a = new(std::nothrow) int[1]; if(a==0) throw "Brak pamieci"; </code> * ''**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: <code c++> 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"; } </code>