Strukture podataka i algoritmi
2.7 Manipulisanje greskama

Nijedan program ili njegov deo ne mogu se smatrati kompletnim bez odgovarajuceg nacina za manipulisanje greskama. Neocekivane greske u programu su katastrofa - u najboljem slucaju, one prouzrokuju samo frustraciju zato sto korisnik mora da ponovi minute ili casove rada, ali u aplikacijama od zivotne vaznosti, cak i najjednostavnija programska greska, ako se ne obradi kako treba, moze biti u mogucnosti da nanese zaista veliku stetu.

Ako je greska fatalna, u smislu da program ne moze nikako da nastavi sa radom, onda on mora da bude u mogucnosti da bar "umre dostojanstveno". Ovo znaci da on mora

2.7.1 Definisanje gresaka

Prilikom odredjivanja sta raditi sa greskama treba najpre precizno definisati sta se smatra greskom. Pazljiva specifikacija svake programske komponente je deo ovog procesa. Pre-uslovi metoda apstraktnog tipa podataka odredjuju stanja sistema (ulazna stanja) koje je metod u mogucnosti da obradi. Post-uslovi svakog metoda bi trebalo jasno da specificiraju rezultat obrade svakog moguceg ulaznog stanja. Prema tome, ako imamo metod:
int f( some_class a, int i )
/* PRE-USLOV: i >= 0 */
/* POST-USLOV:
    ako je i == 0
        vrati 0 i ne menjaj a
    inace
        vrati 1 i zameni a-ov i-ti element sa .... */
Prema tome, kompletna specifikacija ce odrediti Specificirajuci prihvatljiva ulazna stanja u pre-uslovima, takodje je moguce nedvosmisleno podeliti odgovornost za greske.

2.7.2 Obrada gresaka

Posmatrajmo gresku koju mora da obradi konstruktor bilo kojeg dinamicki alociranog objekta: sistem mozda nije u mogucnosti da alocira dovoljno memorije za objekat.

Dobar nacin za kreiranje katastrofe bi bio:

X ConsX( .... )
    {
    X x = malloc( sizeof(struct t_X) );
    if ( x == NULL ) {
        printf("Nedovoljno mem.\n"); exit( 1 );
        }
    else
       .....
    }
Ne samo da je greska toliko sazeta da je od male pomoci prilikom lociranja uzroka greske (poruka bi trebalo da glasi bar "Nedovoljno mem. za X"!), nego ce program jednostavno izaci, ostavljajuci sistem u nekom moguce nestabilnom stanju. Ovaj pristup ima i druge potencijalne probleme:
Opste pravilo: I/O funkcije nisu prenosive!
Funkcija, kao sto je printf, prouzrokuje poruku o gresci u terminalskom prozoru UNIX racunara, ili DOS promptu Windows racunara, ali gde ce poruka otici ako je program pozvan iz Netscape-a?

Znaci, ista funkcija ne mora da bude u stanju da da korisnu dijagnosticku poruku za dva programa koji se izvrsavaju u razlicitim okruzenjima na istom racunaru! Kako bismo od ovakvog programa uopste mogli da ocekujemo neku korist, ako bismo ga prebacili na neki drugi operativni sistem, npr. Macintosh ili Palm OS?

Pre nego sto vidimo sta mozemo da uradimo u ANSI C-u, pogledajmo najpre kako su ovakvi problemi reseni u drugim programskim jezicima.

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