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:

U Adi, disciplinovana grupa programera ce koristiti ugradjenu obradu gresaka uniformno za prenos izuzetaka do nekog unapred dogovorenog nivoa u programu, gde kod koji "poznaje" trenutno okruzenje moze da obradi problem na odgovarajuci nacin.

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

Izuzetak
Izuzetak podize program ili programski modul kada se desi dogadjaj koji bi trebalo da obradi neki drugi program ili modul.

Dalje na Izuzetke u C++
Nazad na Sadrzaj
© John Morris, 1998. Prevod sa engleskog, Dragan Stevanovic, 2002.