r20-06.doc

26
 Rozdział 20. Wyjątki i obsługa błędów Kod zawartych w tej książce przykładów został stworzony w celach ilustracji. Aby nie odwracać twojej uwagi od prezentowanych tutaj zagadnień nie zastosowano w nich żadnych !echaniz!ów obsługi bł"dów. #ednak w prawdziwych progra!ach obsługa bł"dów jest ważna. $ tego rozdziału dowiesz si"% czy! są wyjątki  jak używać wy jątków i jakie są rezultaty ich dzia łania  jak budować hierar chie wyjątków #ak traktować wyjątki w stosunku do obsługi bł"dów czy! jest debugger. Pluskwy, błędy, pomyłki i „psujący się kod &szystkie progra!y zawierają pluskwy 'czyli bł"dy(. )! wi"kszy progra! ty! wi"cej pluskiew i wiele z nich *przedostaje+ si" do ostatecznej jego wersji. ,w orzenie stabilnych wolnych od  pluskiew progr a!ów powinno być prior ytete! każdego kto powa żnie !y-li o progra !owaniu.  ajważniejszy ! proble!e! przy tworzeniu oprogra !owania jest bł"dny niestabilny kod. & wielu poważnych przedsi"wzi"ciach in/or!atycznych najwi"kszy! wydatkie! jest jego testowanie i poprawianie. Kto- kto wpadnie na po!ysł jak tworzyć niski! koszte! i na czas dobre solidne i odporne progra!y zrewolucjonizuje prze!ysł oprogra!owania. Kłopoty z progra!e! !ogą być powodowane przez kilka różnych rodzajów bł"dów. 0ierwszy ! z nich jest bł"dna logika% progra! robi to co !a robić ale algoryt! nie został wła-ciwie  prze!y-lany . 1rugi! rodza je! bł"dów jest sy ntaktyka% niewła-ciwa konstr ukcja /unkcja czy struktura. ,e dwa rodzaje bł"dów wyst"pują najcz"-ciej i szuka ich wi"kszo-ć progra!istów.

Upload: greg

Post on 05-Nov-2015

215 views

Category:

Documents


0 download

TRANSCRIPT

Szablon dla tlumaczy

2

Cz I ( Podstawy obsugi systemu WhizBang (Nagwek strony)

Rozdzia 20.Wyjtki i obsuga bdw

Kod zawartych w tej ksice przykadw zosta stworzony w celach ilustracji. Aby nie odwraca twojej uwagi od prezentowanych tutaj zagadnie, nie zastosowano w nich adnych mechanizmw obsugi bdw. Jednak w prawdziwych programach obsuga bdw jest wana.

Z tego rozdziau dowiesz si:

czym s wyjtki,

jak uywa wyjtkw i jakie s rezultaty ich dziaania,

jak budowa hierarchie wyjtkw,

Jak traktowa wyjtki w stosunku do obsugi bdw,

czym jest debugger.

Pluskwy, bdy, pomyki i psujcy si kod

Wszystkie programy zawieraj pluskwy (czyli bdy). Im wikszy program, tym wicej pluskiew i wiele z nich przedostaje si do ostatecznej jego wersji. Tworzenie stabilnych, wolnych od pluskiew programw powinno by priorytetem kadego, kto powanie myli o programowaniu.

Najwaniejszym problemem przy tworzeniu oprogramowania jest bdny, niestabilny kod. W wielu powanych przedsiwziciach informatycznych najwikszym wydatkiem jest jego testowanie i poprawianie. Kto, kto wpadnie na pomys, jak tworzy niskim kosztem i na czas dobre, solidne i odporne programy, zrewolucjonizuje przemys oprogramowania.

Kopoty z programem mog by powodowane przez kilka rnych rodzajw bdw. Pierwszym z nich jest bdna logika: program robi to, co ma robi, ale algorytm nie zosta waciwie przemylany. Drugim rodzajem bdw jest syntaktyka: niewaciwa konstrukcja, funkcja, czy struktura. Te dwa rodzaje bdw wystpuj najczciej i szuka ich wikszo programistw.

Badania i dowiadczenie programistw wykazay, e im pniej zostanie wykryty bd, tym bardziej kosztowne staje si jego usunicie. Najmniej kosztowne bdy i pomyki to te, ktrych uda si unikn. Kolejne mao kosztowne bdy to bdy wykrywane przez kompilator. Standardy jzyka C++ wymuszaj na kompilatorze wychwytywanie coraz wikszej iloci bdw ju podczas kompilacji.

Bdy, ktre zostay wkompilowane i zostay wychwycone przy pierwszym tecie tj. te, ktre niezmiennie powoduj zaamanie programu s mniej kosztowne w wyszukaniu i poprawieniu ni bdy, ktre powoduj zaamanie programu dopiero po pewnym czasie.

Czstszym problemem ni bdy logiczne lub syntaktyczne jest wraliwo programu: dziaa on poprawnie, gdy uytkownik wpisuje liczb tam, gdzie powinien j wpisa, lecz zaamuje si, gdy uytkownik wpisze litery (zamiast liczby). Inne programy zaamuj si po wyczerpaniu si pamici, gdy dyskietka zostanie wyjta ze stacji lub gdy modem zerwie poczenie.

Aby walczy z tego rodzaju bdami, programici staraj si uodporni swoje programy. Odporny program potrafi obsuy wszystko, co moe si wydarzy podczas jego dziaania, od dziwnych danych wprowadzanych przez uytkownika po nagy brak pamici.

Naley dokona rozrnienia pomidzy pluskwami, ktre powstay, poniewa pomyli si programista; bdami logicznymi, ktre powstay, poniewa programista nie zrozumia zagadnienia lub nie wie, jak sobie z nim poradzi, oraz wyjtkami, ktre powstaj, gdy wystpi niezwyky, cho przewidywalny problem, taki jak wyczerpanie si zasobw (pamici czy miejsca na dysku).

Wyjtki

Sytuacji wyjtkowych nie da si wyeliminowa; mona si jedynie na nie przygotowa. Uytkownikom programw od czasu do czasu koczy si pami i jedynym zagadnieniem pozostaje to, co twj program zrobi w takim przypadku. Masz wtedy do wyboru:

zaamanie programu,

poinformowanie uytkownika i zamknicie programu,

poinformowanie uytkownika i pozwolenie mu na zwolnienie dodatkowej pamici i podjcie ponownej prby,

podjcie odpowiednich dziaa i kontynuowanie pracy bez niepokojenia uytkownika.

Cho nie zawsze jest konieczne (a czasem nawet niewskazane) automatyczne i niewidoczne obsugiwanie wszystkich wyjtkowych sytuacji, jednak trzeba co zrobi, aby nie pozwoli na zaamanie si programu.

Obsuga wyjtkw w C++ dostarcza bezpiecznej (ze wzgldu na typ), zintegrowanej metody reagowania na niezwyke, cho przewidywalne sytuacje, ktre pojawiaj si podczas dziaania programu.

Wyjtki

W C++ wyjtek jest obiektem, ktry jest przekazywany z obszaru kodu, w ktrym wystpi problem, do tej czci kodu, ktra odpowiada za jego obsuenie. Typ wyjtku okrela obszar kodu, ktry ma obsuy problem, za zawarto zgoszonego obiektu, o ile istnieje, moe posuy do dokadniejszego poinformowania uytkownika.

Reguy rzdzce wyjtkami s bardzo proste:

rzeczywista alokacja zasobw (na przykad alokacja pamici czy blokowanie pliku) zwykle odbywa si na bardzo niskim poziomie programu,

logika okrelajca, co naley zrobi, gdy operacja si nie powiedzie, pami nie moe zosta zaalokowana czy plik nie moe zosta zablokowany, zwykle znajduje si na duo wyszym poziomie programu, wraz z kodem wsppracujcym z uytkownikiem,

wyjtki stanowi ekspresow ciek od kodu alokujcego zasoby do kodu mogcego obsuy sytuacj wyjtkow. Gdy pomidzy nimi wystpuj warstwy funkcji interwencyjnych, daje im si moliwo uporzdkowania zaalokowanej pamici. Nie wymaga si od nich jednak, aby zawieray wycznie kod, ktrego przeznaczeniem jest przekazywanie informacji o bdzie dalej.

Jak uywane s wyjtki

Obszary kodu, ktre mog powodowa problem, ujmowane s w bloki try (sprbuj). Na przykad:

try

{

SomeDangerousFunction(); // potencjalnie niebezpieczna funkcja

}

Z kolei bloki catch (wychwy) obsuguj wyjtki zgoszone w bloku try. Na przykad:

try

{

SomeDangerousFunction();

}

catch(OutOfMemory)

{

// podejmij jakie dziaania przeciwdziaajce brakowi pamici

}

catch(FileNotFound)

{

// podejmij czynnoci przeciwdziaajce brakowi pliku na dysku

}

Podstawowe etapy obsugiwania wyjtkw to:

1. Zidentyfikowanie tych obszarw programu, w ktrych zaczynaj si operacje mogce powodowa wyjtek i umieszczenie ich w blokach try.

2. Stworzenie blokw catch wychwytujcych zgaszane wyjtki, porzdkujce zaalokowan pami i ewentualnie informujce uytkownika. Listing 20.1 przedstawia uycie zarwno blokw try, jak i catch.

Wyjtki s obiektami uywanymi do przekazywania informacji o problemie.

Blok try jest blokiem ujtym w nawiasy klamrowe, wewntrz ktrego mog by zgaszane wyjtki.

Blok catch jest blokiem wystpujcym bezporednio po bloku try; s w nim obsugiwane zgoszone wyjtki.

Gdy zostanie zgoszony wyjtek, sterowanie przechodzi do waciwego bloku catch nastpujcego po biecym bloku try.

UWAGANiektre bardzo stare kompilatory nie obsuguj wyjtkw. Wyjtki s jednak czci standardu ANSI C++ i wszystkie najnowsze wersje kompilatorw w peni je obsuguj. Jeli posiadasz starszy kompilator, nie bdziesz mg skompilowa i uruchomi przykadw zawartych w tym rozdziale. Jednak mimo to powiniene przeczyta ca jego zawarto i wrci do tego materiau pniej, gdy zdobdziesz nowsz wersj kompilatora.

Listing 20.1. Zgaszanie wyjtku

0: #include

1: using namespace std;

2:

3: const int DefaultSize = 10;

4:

5: class Array

6: {

7: public:

8: // konstruktory

9: Array(int itsSize = DefaultSize);

10: Array(const Array &rhs);

11: ~Array() { delete [] pType;}

12:

13: // operatory

14: Array& operator=(const Array&);

15: int& operator[](int offSet);

16: const int& operator[](int offSet) const;

17:

18: // akcesory

19: int GetitsSize() const { return itsSize; }

20:

21: // funkcja zaprzyjaniona

22: friend ostream& operator