210 likes | 335 Views
Programski jezici. proleće/leto 2008. Postupanje sa greškama. Ispravni i robustni programi Program je ispravan ako radi tačno ono što treba Program je robustan ako postupa sa neočekivanim okolnostima na razuman način. P ostupanje sa greškama. Primer: sortiranje brojeva
E N D
Programski jezici proleće/leto 2008
Postupanje sa greškama • Ispravni i robustni programi • Program je ispravan ako radi tačno ono što treba • Program je robustan ako postupa sa neočekivanim okolnostima na razuman način Programski jezici
Postupanje sa greškama • Primer: sortiranje brojeva • Program mora uvek da bude ispravan • Program koji pogrešno sortirabrojeve je beskoristan • Robustan programmora da pravilno postupa sa pogrešnim ulaznim podacima • Program ne mora uvek da bude robustan • Pomoćni program za svoje potrebe ne mora da bude potpuno robustan Programski jezici
Postupanje sa greškama • Posledice loših programa • Nerviranje (program se “ukočio” ili “puca”) • Izgubljeno vreme i utrošen rad • Izgubljen novac i ugled u bankama, tel. komanijama, kosmičkim projektima • Gubitak ljudskih života zbog pogrešno programiranih medicinskih aparata Programski jezici
Postupanje sa greškama • Ugrađeni mehanizmi u Javi • Sve promenljive moraju biti deklarisane • Proveravanje indeksa niza da li leži u dozvoljenim granicama (“buffer overflow errors”) • Direktno manipulisanje pokazivačima nije dozvoljeno • “Curenje” memorije nije moguće (ili bar smanjeno) Programski jezici
Postupanje sa greškama • Problemi koji ostaju u Javi • Numerička izračunavanja ne podležu otkrivanju grešaka • celobrojno prekoračenje 2147483647 +1 → −2147483648 • realno prekoračenje Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY Double.NaN (“not a number”) – nedefinisan rezultat (1/0, √-4) • Približno predstavljanje realnih brojeva • 1/3 = 0.3333 … ≈ 0.3333333 Programski jezici
Postupanje sa greškama • Robustni program mora “preživeti” neobične i izuzetne okolnosti • Jedan način za postupanje sa problemima: predvideti probleme u programu i uključiti testiranje za svaki mogući problem • Primer: korišćenje elemenata niza a Programski jezici
Postupanje sa greškama if (i < 0 || i > a.length) { // postupanje sa problemom } else { // normalna obrada elementa a[i] } Programski jezici
Postupanje sa greškama • Nedostaci ovog pristupa • Teško i ponekad nemoguće predvideti sve moguće probleme • Nije uvek jasno šta uraditi kada se otkrije problem • Jednostavan program postaje komplikovana mešavina “pravih” naredbi i if naredbi Programski jezici
Izuzeci • Drugi način za postupanje sa problemima (u Javi): izuzeci • Izuzeci su opštiji pojam od grašaka – sve okolnosti koje predstavljaju izuzetak od normalnog toka izvršavanja • Sve greške • Specijalni slučajevi ne koje programer nema uticaja ili narušavaju normalnu logiku programa Programski jezici
Izuzeci • Kada se izuzetak (izuzetna okolnost) dogodi u toku izvršavanja – izuzetak je izbačen • Izvršavanje programa se prekida (“puca”) ako se ne rukuje izuzetkom • Rukovanje izuzetkom – izuzetak se hvata i obrađuje Programski jezici
Izuzeci • Kada se izuzetak dogodi, izbacuje se objekat izuzetka koji sadrži • poruku o tome šta je dovelo do izuzetka • listu metoda koji su se izvršavali kada se izuzetak dogodio (“method call stack”) • Svi objekti izuzetka moraju pripadati nekoj klasi koja je naslednica standardne klase java.lang.Throwable • Različiti tipovi izezetaka su predstavljeni nekom proširenom klasom klase Throwable Programski jezici
Izuzeci • Složena hijerarhija klasa Throwable Programski jezici
Izuzeci • Klasa Throwable sadrži nekoliko objektnih metoda koji se mogu koristiti sa svakim objektom izuzetka Throwable e; e.getMessage() – poruka o grešci e.toString() – stringovna reprezentacija objekta izuzetka e.printStackTrace() – lista aktivnih metoda (Method Call Stack) Programski jezici
Izuzeci • Hvatanje i obrada izuzetaka try { // naredbe koje mogu dovesti do izuzetka } catch (Exception e) { // naredbe koje mogu obrađuju izuzetak } Programski jezici
Izuzeci • Izvršavanje try-catch bloka • Izvršavaju se naredbe u try bloku • Ako se ne izbaci nijedan ili se izbaci izuzetak različitog tipa od onog navedenog u (…) iza reči catch, catch blok se preskače • Ako se izbaci izuzetak tipa navedenog u (…) iza reči catch, izvršava se catch blok • Nastavlja se izvršavanje programa iza catch bloka, ako drugačije nije rešeno Programski jezici
Izuzeci • Primer try { a[i] = 0; } catch (ArrayIndexOutOfBoundsException e) { System.out.println(“Indeks izvan granica”); e.printStackTrace(); } Programski jezici
Izuzeci • Pisanje try-catch bloka • Vitičaste zagrade su obavezne • Blok u catch klauzuli – rukovalac izuzecima (“exception handler”) • Hvata se samo izuzetak tipa ArrayIndexOutOfBoundsException • Može biti više catch klauzula Programski jezici
Izuzeci • Primer try { a[i] = 0; } catch (ArrayIndexOutOfBoundsException e) { System.out.println(“Indeks izvan granica”); e.printStackTrace(); } catch (NullPointerException e) { System.out.println(“Niz a ne postoji”); e.printStackTrace(); } Programski jezici
Izuzeci • ArrayIndexOutOfBoundsException i NullPointerExceptionsu klase naslednice odRuntimeException try { a[i] = 0; } catch (RuntimeException e) { System.out.println(“Greška u radu sa nizom a”); System.out.println(“Greška je “ + e); e.printStackTrace(); } Programski jezici
Izuzeci • Prethodni primeri nisu realistični • Pažljivo programiranje je bolje od rukovanja izuzecima • Rukovanje izuzecima tipa RuntimeException nije obavezno • Rukovanje izuzecima nekih drugih tipova jeste obavezno Programski jezici