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:
- Sta ako smo ovaj kod ugradili u neki doteran GUI (graficki korisnicki interfejs)
koji jednostavno nema mogucnosti za standardan izlaz
(sa kojim radi printf)?
Mozda necemo uopste videti poruku dok program puca!
- Mozda smo koristili ovaj kod u sistemu, kao sto je ugradjeni procesor
(kontrolni racunar u kamionu), koji uopste nema standardan izlaz!
- Koriscenje funkcije exit
pretpostavlja prisustvo nekog programa viseg nivoa,
npr. DOS prompta,
koji ce prepoznati i procesira poruku o gresci 1.
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.