wyjatki 

po polsku



Wyj±tki (exceptions)

Java w odró¿nieniu od wielu innych jêzyków programowania posiada bardzo
wygodny i skuteczny mechanizm obs³ugi b³êdów. Inaczej ni¿ w C, gdzie rozpoznawanie
rozpoznawanie b³êdów odbywa³o siê poprzez sprawdzanie wartosci zwracanych
przez funkcje, w Javie wywo³ywaniem procedur obs³ugi b³êdów zajmuje siê
interpreter.

Poni¿szy przyk³ad poka¿e zasadê budowania metod odpowiedzialnych za
obs³ugê b³êdów w programach Javy. Wykorzystamy do tego konstrukcjê "try-catch-finally".
Blok "try" zawiera fragment kodu ¼ród³owego "cia³a"
metody (kod w którym mo¿e pojawiæ siê b³±d). Definiuj±c ten blok nie precyzujemy
o obs³ugê jakich b³êdów chodzi. Okre¶lamy nim jedynie obszar wra¿liwy na
b³êdy, które chcemy obs³u¿yæ. Je¿eli w trakcie dzia³ania programu wyst±pi
b³±d, dzia³anie procedur bloku "try" zostanie zakoñczone, a uruchomione
zostan± procedury w odpowiadajacym mu bloku "catch".

W³asciwa obs³uga b³êdów (wyj±tków) przeprowadzana jest wiêc przez odpowiednie
instrukcje w wystêpuj±cych dalej blokach "catch". Ka¿dy z nich
odpowiedzialny jest za obs³ugê dok³adnie jednego rodzaju wyj±tków (dzielenie
przez zero, niepowodzenie otwarcia pliku etc.).

Blok "finally" wykonywany wykonywany jest zawsze przy obs³udze
ka¿dego z powsta³ych wyjštków. Co wiêcej - jest on tak¿e wykonywany wtedy,
gdy którys z bloków "catch" bêdzie chcia³ zakoñczyæ dzia³anie
danej funkcji.. Wprzypadku operacji wejscia/ wyjscia korzystnie jest umiesciæ
w nim polecenie zamkniêcia pliku (close).

void Demo
{
try
{
// implementyacja metody "Demo()"
// w te cze¶ci nie musi nastepowaæ kontrola wyst±pienia b³êdów
}
catch (Exeption1)
{
// obs³uga wyj±tku Exption1
}

catch (Exeption2)
{
// obs³uga wyj±tku Exption2
}

catch (Exeption3)
{
// obs³uga wyj±tku Exption3
}

// ...

finally
{
// zakoñczenie dzia³anmia metody;
// tu znajduj± siê operacje , które bezwzglêdnie musz±
// zostaæ wykonane (np. zamkniêcie pliku)
}
}


A tak na marginesie wszystkie wyj±tki to obiekty (wzglêdnie klasy) utworzone
jako pochodne klasy "Exeption". Zamiast wiêc podawaæ konkretny
typ wyj±tku, jak na przyk³ad "IOExeption", s³u¿±cy do obs³ugi
b³êdów wystêpuj±cych podczas operacji wejcia/wyjscia, mo¿na równie¿ bezposrednio
wywo³aæ "catch (Exeption e)". Taki blok "catch " zostanie
wywo³any niezale¿nie od rodzaju wyj±tku, jaki wyst±pi³. Z regu³y nie jest
to dzia³anie po¿±dane - du¿o korzystniejsza jest sytuacja, gdy jeden konkretny
blok odpowiedzilny jest za obs³ugê jednego rodzaju b³êdu. W wydatny sposób
pozwala to zachowaæ wiêksz± przejrzystosæ kodu programu.

Interpreter Javy podczas wykonywania programu udostêpnia wiele najczêsciej
wystêpuj±cych wyj±tków (na przyk³ad b³ad dzielenia przez zero). Czêsto
koniecze jest jednak definiowanie ca³kiem nowych typów wyj±tków lub te¿
bezporednie wywo³anie procedur ich obslugi. Poniewa¿ wyj±tek to te¿ obiekt,
tworzenie ich nowych typów jest mo¿liwe poprzez dziedziczenie od klasy
bazowej "Exeption".

Do wygenerowania konkretnego rodzaju wyj±tku mo¿emy siê pos³ugiwaæ poleceniem
"throw". Jako parametru u¿ywamy odpowiedniego dla tego polecenia
obiektu. Klasa, która wygeneruje dany wyj±tek zbudowana bêdzie w nastêpuj±cy
sposób:

public DemoClass throws DemoException
{
// ...
if (Wyst±pi³B³±d)
trow new DemoException;
// ...
}


Dopisuj±c przy definicji klasy "... throws DemoExeption" informujemy
kompilator (i innych programistów), ¿e metody tej klasy mog± generowaæ
wyj±tki typu "DemoExceptions". Jesli w trakcie dzia³ania programu,
wyst±pi³by wyj±tek tego typu, automatycznie nast±pi odszukanie bloku "catch",
odpowiedzilnego za jego obs³ugê. W celu znalezienia wspomnianego bloku
zostanie przeszukany ca³y stos wywo³añ funkcji (to znaczy caly call-stack).Wyj±tek
zostanie obs³u¿ony przez pierwszy znaleziony blok "catch". Wten
sposób mo¿liwe jest wiêc scis³e dopasowanie zachowania programu w sytuacji
wyst±pienia ktoregos z wyj±tków.

Podczas przetwarzania kodu programu kompilator sprawdza, czy program
posiada bloki "catch", odpowiedzialne za obs³ugê wzystkich b³êdów,
jakie potencjalnie mog± wyst±piæ. Program podlega dalszemu przetworzeniu
jedynie wówczas, gdy zostanie znaleziony taki blok dla ka¿dego definowanych
przez program wyj±tków. Nie oznacza to oczywiscie, ¿e program napisany
w Javie musi zawieraæ kod metod ob³ugi wszystkich b³êdów, jakie mog± siê
pojawiæ w trakcie jego dzia³ania. W przypadku wyst±pienia wyj±tku rodzaju
"RuntimeException" (na przyk³ad dzielenie przez zero) je¿eli
tylkko dla tego wyj±tku nie zosta³a zaimplementowana wprost ¿adna procedura
obs³ugi, jego obs³ug± zajmuje siê system.Natomiast w sytuacji wyst±pienia
wyj±tku, którego program nie mo¿e przechwyciæ, Java Virtual Machine koñczy
dzi³anie programu.

Oczywiscie programista nie jest zmuszony do korzystania z wyj±tków.
Ka¿dy, kto do obs³ugi b³êdów wola³by u¿yæ klasycznych instrukcji if-else,
mo¿e to oczywiscie uczyniæ unikaj±c stosowania bloków "try-catch".
Nawet i tym najbardziej zagorza³ym zwolennikom jêzyka C z pewnosci± nie
zaszkodzi zapoznanie siê z t± now± technik±. Wyj±tki pozwalaj± na zachowanie
przejrzystej struktury programu, pomagaj± unikaæ b³êdów wynikaj±cych z
niedok³adnosci, a tym samym skracaj± czas tworzenia programu.
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • pajaa1981.pev.pl