Strukture podataka i algoritmi |
2.7.3 Izuzeci u Adi |
Ada definise EXCEPTION (izuzetak)
koji moze da se obradi pomocu
exception handler-a (obradjivaca gresaka),
na bilo kom nivou u programu iznad onog u kome je izuzetak generisan,
tj. RAISEd (podignut).
PACKAGE adtX IS
TYPE X IS PRIVATE;
EXCEPTION van_opsega;
PROCEDURE f( a: INOUT X; b: INTEGER );
END adtX;
PACKAGE BODY adtX IS
PROCEDURE f( a: INOUT X; b: INTEGER ) IS
BEGIN
......
IF b < neka_granica THEN
-- Normalna obrada
ELSE
RAISE van_opsega;
END IF;
END adtX;
Ovaj paket generise izuzetak van_opsega
koji moze da uhvati bilo koja rutina koja koristi f.
WITH adtX; USE adtX; -- Koristi adtX
PROCEDURE g( ... ) IS
BEGIN
...
f( a, n ); -- Poziva metod f
... -- Nastavlja ovde ako nema izuzetka
.... -- Vrati se odavde ako nema gresaka
EXCEPTION
WHEN van_opsega =>
... -- obradi izuzetak
END g;
U ovom primeru, izuzetak je obradjen u proceduri g,
koja je pozvala funkciju f, koja je generisala izuzetak.
Kod koji procesira izuzetak mogu da cine bilo koje komande Ade:
tu cak moze da se generise i neki novi izuzetak.
Ako izuzetak nije 'uhvacen', on se prenosi navise kroz stek poziva sve dok ga neka funkcija ne obradi. (Ako nijedna funkcija ne obradi izuzetak, on se prenosi sve do najviseg nivoa i prouzrokuje izlaz iz programa. Medjutim, od implementacije Ade se ocekuje da prikaze ime izuzetka koji je prouzrokovao izlaz iz programa.)
S obzirom da se izuzeci prenose na proizvoljno visoke nivoe Ada programa, lako je urediti da se izuzeci u Adi uhvate na onom nivou gde postoji odgovarajuci interfejs za rad sa njima. Na primer, u GUI programu rutine za obezbedjivanje interakcije sa korisnikom pomocu prozora, misa, tastature itd, su obicno najviseg nivoa u programu. Ove rutine "znaju" kako da prikazu dijalog prozor sa upozorenjem koje kaze korisniku da je nastao problem i prisiljava ga da preduzme odredjenu akciju za resavanje problema. Alternativno, u ugradjenom procesoru rutine bi "znale" kako da posalju poruku kroz komunikacijski kanal do nekog glavnog procesora.
Program nizeg nivoa, koji se moze visestruko iskoristiti, treba da bude u mogucnosti da radi ispravno u svakom okruzenju - GUI, tekst terminal, ugradjeni sistem, itd. Mogucnost Ade da prenosi izuzetke na nivo na kome program zna dovoljno o okruzenju kako bi prijavio odgovarajucu gresku cini zivot mnogo jednostavnijim za programera visestruko iskoristivog programa. Definisu se izuzeci koji odgovaraju svim greskama koje mogu da nastanu. Visestruko iskoristiv kod jednostavno generise izuzetke. Korisnik koda ima mogucnost da odluci kada (tj. na kom nivou) ce obraditi izuzetak.
Dodatna koristi od mehanizma izuzetaka u Adi je da on omogucava uniforman nacin za manipulisanje greskama. Prepusteni sebima, programeri su u mogucnosti da definisu svoj stil podizanja i obrade gresaka, na primer, mozemo:
Ada dalje standardizuje ponasanje pre-definisuci veliki broj izuzetaka za uobicajene probleme, kao sto je constraint_error kada se pokusa da postavi vrednost promenljivoj koja je van dozvoljenog opsega za njen tip.
Kljucni pojmovi |
Dalje na Izuzetke u C++ Nazad na Sadrzaj |