16 PREVENCIJA OTKAZA 1 Postupci 1 ugraditi u

  • Slides: 18
Download presentation
16 PREVENCIJA OTKAZA 1

16 PREVENCIJA OTKAZA 1

Postupci 1. ugraditi u klasu metode-indikatore za proveru nastanka otkaza (npr. is. Empty kod

Postupci 1. ugraditi u klasu metode-indikatore za proveru nastanka otkaza (npr. is. Empty kod steka) 2. havarijski prekid programa (metoda System. exit(int exitcode)) 3. vrednost metode kao kod uspešnosti 4. rukovanje izuzecima 2

vrednost metode kao kod uspešnosti • pogodan za void metode, nepogodan za metode koje

vrednost metode kao kod uspešnosti • pogodan za void metode, nepogodan za metode koje vraćaju rezultat • pogodnost jave: ako je vraćeni rezultat objekat, tada se faktički vraća referenca – u takvim slučajevima vrednost null može da bude kod neuspešnosti (dosta često se koristi) 3

Rukovanje izuzecima • podaci o nastalom izuzetku se pakuju u objekte Object rezervisano za

Rukovanje izuzecima • podaci o nastalom izuzetku se pakuju u objekte Object rezervisano za javu Throwable Error ! Exception Runtime. Exception 4

 • klase izuzetaka su obične klase, uređene u mini-hijerarhiju sa korenom u klasi

• klase izuzetaka su obične klase, uređene u mini-hijerarhiju sa korenom u klasi Throwable • za rukovanje izuzecima mogu se koristiti gotove klase ili se mogu praviti klase koje se obavezno uključuju u hijerarhiju "ispod" klase Exception ili neke koja je već nasleđuje 5

karakteristične metode • postoje u svim klasama izuzetaka, jer su definisane u klasi Throwable

karakteristične metode • postoje u svim klasama izuzetaka, jer su definisane u klasi Throwable • konstruktor() i konstruktor(String poruka) • String get. Message() • String to. String() ! • void print. Stack. Trace() – standardna reakcija na nastanak izuzetka 6

primer sopstvene klase public class My. Exception extends Exception { public My. Exception() {}

primer sopstvene klase public class My. Exception extends Exception { public My. Exception() {} public My. Exception(String message) { super(message+" FROM My. Exception"); } } 7

generisanje izuzetka • izuzetak se generiše naredbom throw sa opštim oblikom throw new konstruktor(parametri)

generisanje izuzetka • izuzetak se generiše naredbom throw sa opštim oblikom throw new konstruktor(parametri) gde je sa konstruktor označen konstruktor klase izuzetaka koja se koristi. • na primer, if(x<0) throw new My. Exception("Negativan argument"); ! 8

 • metoda koja generiše izuzetak mora ga i deklarisati iskazom throws na sledeći

• metoda koja generiše izuzetak mora ga i deklarisati iskazom throws na sledeći način: tip ime. Metode(parametri) throws Ex 1, . . . , Exn {. . . . . } gde su Ex 1, . . . , Exn klase izuzetaka koje generiše metoda. public double f(double x) throws My. Exception { if(x<0) throw My. Exception("Negativan argument"); return 2*Math. sin(x)*Math. sqrt(x); } 9

 • Važi inkluzioni polimorfizam. Sledeća metoda može da generiše bilo koji izuzetak što

• Važi inkluzioni polimorfizam. Sledeća metoda može da generiše bilo koji izuzetak što nasleđuje klasu Exception: tip ime. Metode throws Exception {. . . } • sledeća metoda može da generiše bilo koji izuzetak: tip ime. Metode throws Throwable {. . . } 10

 • Izuzeci iz klase Runtime. Exception (i njenih potklasa) ne moraju se deklarisati:

• Izuzeci iz klase Runtime. Exception (i njenih potklasa) ne moraju se deklarisati: nema iskaza throws public double f(double x) { if(x<0) throw Runtime. Exception("Negativan argument"); return 2*Math. sin(x)*Math. sqrt(x); } 11

prihvatanje izuzetka • Izuzeci se mogu – prihvatiti i obraditi tzv. blokom try –

prihvatanje izuzetka • Izuzeci se mogu – prihvatiti i obraditi tzv. blokom try – proslediti višem nivou poziva – delimično obraditi i proslediti višem nivou 12

prihvatanje i obrada • opšti oblik bloka try: try {. . . kritične naredbe.

prihvatanje i obrada • opšti oblik bloka try: try {. . . kritične naredbe. . . } catch(Ex. Class 1 e) {. . . obrada izuzetka e } catch(Ex. Class 2 e) {. . . obrada izuzetka e. . . . } catch(Ex. Classn e) {. . . obrada izuzetka e } finally {. . . obavezno se izvrsava } lista hendlera pregleda se linearno. Paziti na to da se potomak nađe ispred pretka! 13

 • najčešće korišćen način za obradu izuzetka je poziv metode print. Stack. Trace()

• najčešće korišćen način za obradu izuzetka je poziv metode print. Stack. Trace() kojim se prikazuju tačke (linije koda) u kojima su nastali izuzeci public void prikazf (double y) { try { System. out. println("f("+y+")="+f(y)); } catch(My. Exception e { System. out. println(e. get. Message()); e. print. Stack. Trace(); } } 14

prosleđivanje • prosleđivanje se vrši izostavljanjem bloka try i deklarisanjem izuzetka: public void prikazf

prosleđivanje • prosleđivanje se vrši izostavljanjem bloka try i deklarisanjem izuzetka: public void prikazf (double y) throws My. Exception { System. out. println("f("+y+")="+f(y)); ako nije Runtime. Exception } • ako izuzetak pripada klasi Runtime. Exception ili njenim potklasama, ne mora se deklarisati! 15

obrada i prosleđivanje • prosleđivanje se vrši kombinacijom bloka try i naredbe throw: public

obrada i prosleđivanje • prosleđivanje se vrši kombinacijom bloka try i naredbe throw: public void prikazf (double y) throws My. Exception { try { System. out. println("f("+y+")="+f(y)); ako nije Runtime. Exception } catch(My. Exception e { System. out. println(e. get. Message()); e. print. Stack. Trace(); throw e; } } 16

Propagacija izuzetaka • izuzetak mora biti detektovan! ovo je main m 0 m 1

Propagacija izuzetaka • izuzetak mora biti detektovan! ovo je main m 0 m 1 ovde je nastao izuzetak mk-1 propagacija izuzetka mk 17

 • svaka od metoda m 0, . . . , mk-1, mk može

• svaka od metoda m 0, . . . , mk-1, mk može se pripremiti: – da nema hendler za nastali izuzetak; tada se izuzetak automatski prosleđuje na viši nivo poziva, ali mora biti deklarisan (osim za Runtime. Exception i njene potklase) – da ima hendler; tada se hendler izvršava i propagacija se zaustavlja • u hendler se može ubaciti naredba throw e gde je e izuzetak; tada se propagacija nastavlja izuzetkom e 18