Kurs: Core Windows Forms Technologies Materijali vezani uz ovu lekciju: - Test izuzeci - Izuzeci (PDF dokument) Pojam izuzetakaIzuzetak je slučaj koji se dešava tokom izvršavanja programa koji može da poremeti normalan rad programa. Izuzetak može nastati zbog greške u kodu ili u kodu koji se poziva, usled neraspoloživosti resursa koji se poziva, nedostatka memorije, neočekivanih uslova pri izvršavanju koda, pogrešnog konvertovanja podataka, nepravilnih ulaznih podataka i sl. Izuzetak je objekat izveden iz klase Exception. Izuzeci se obrađuju korišćenjem ključnih reči try, catch i finally.
Ovde je prikazan način obrade izuzetaka. Linije koda u kojima može doći do generisanja (izbacivanja) izuzetaka stavljaju se unutar try bloka.
Iza try bloka dolazi jedan ili više catch blokova koji kao što im samo ime kaže služe za hvatanje izuzetaka. U tom slučaju svaki catch blok hendluje specijalizovanu klasu izuzetaka. Kao što se vidi iza try bloka postavljen samo jedan catch blok. U prikazanom catch bloku hvataju se izuzeci tipa Exception. Pošto je svaka klasa izuzetaka izvedena iz ove klase izuzetaka ovakvim catch blokom biće uhvaćen bilo koji izuzetak. Ukoliko pri izvršavanju koda unutar try bloka ne dođe do generisanja izuzetaka kod unutar catch bloka se neće izvršavati. Kod unutar catch bloka naziva se exception handler. To može biti jednostavna poruka korisniku da je nepravilno uneo podatke u polja za unos. Bitno je da ne dođe do "pucanja" koda usled nepravilnosti u izvršavanju koda. Primeri klasa izuzetaka Ovde je prikazano hendlovanje izuzecima tipa NullReferenceException:
Ovakav izuzetak se generiše pri referenciranju objekta koji ne postoji tj. null objekta. Klasa MojaKlasa je tzv. "umotani int" tj. ima samo jedan atribut tipa int. Unutar try bloka se instancira objekat ove klase. Referenca na ovaj objekat je mojObjekat. Zatim se referenci mojObjekat dodeljuje null vrednost što znači da sada mojObjekat ne referencira (ne ukazuje) ni na jedan objekat tj. to je null referenca. Kada se pokuša da se preko reference mojObjekat dodeli vrednost objektu na koji ta referenca ukazuje generiše se izuzetak tipa NullReferenceException tj. kompajler nas obaveštava da referenca ne ukazuje ni na kakav objekat. Treba rećia da postoje još neke od mnogobrojnih klasa izuzetaka kao što su IndexOutOfRangeException, izuzeci ove klase se generišu npr. kada pokušamo da pristupimo članu niza koji ne postoji. Treba napomenuti i klasu izuzetaka ArithmeticException čiji se objekti generišu usled nepravilnih aritmetičkih operacija, DividebByZeroException je klasa izuzetaka čiji se objekti generišu pri pokušaju deljenja sa nulo itd.
Ukoliko se želi finija obrada izuzetaka koristi se više catch blokova. U zavisnosti od generisanog izuzetka se u tom slučaju primenjuje različit exception handler. U primeru prikazanom u nastavku se posebno obrađuju izuzeci tipa DivideByZeroException a posebno izuzeci tipa ArithmeticException. Posebno se vrši obrada izuzetaka ukoliko je došlo do deljenja sa nulom a posebno ukoliko je došlo do nekog drugog aritmetičkog izuzetka.
Prilikom pisanja više catch blokova moraju se najpre obrađivati izuzeci koji su specijalizovaniji a tek onda oni opštiji. Pošto je klasa DivideByZeroException izvedena iz klase ArithmeticException ukoliko bi redosled catch blokova bio obrnut nikada se ne bi ušlo u deo koda za obradu izuzetaka usled deljenja sa nulom jer je svaki takav izuzetak i aritmetički izuzetak.
Ukoliko je došlo do izuzetaka oni se hendluju unutar catch bloka. Bez obzira da li je došlo do izuzetaka ili nije potrebno je zatvoriti konekciju sa bazom podataka da bi se oslobodili njeni resursi. Zbog toga se zatvaranje konekcije vrši unutar finally bloka.
U nekim situacijama je potrebno da korisnik generiše izuzetak koji inače ne bi bio generisan od strane sistema. To je moguće uraditi korišćenjem ključne reči throw. Npr. izraz throw(new ArgumentNullException()) će generisati izuzetak ArgumentNullException. Ovakav izraz se mora napisati unutar try bloka ili unutar funkcije koja će biti pozvana unutar try bloka. Naravno i ovako generisani izuzetak se mora obraditi pisanjem catch blokova. Druga primena eksplicitnog izbacivanja izuzetaka je prikazana u primeru koji sledi. Sistemski generisan izuzetak se hvata unutar catch bloka, objektu izuzetka se dodaju neke informacije i izuzetak se ponovo izbacuje. Funkcija CitajPodatke() izbacuje ponovo prethodno uhvaćeni izuzetak.
Hendlovanje prethodno izbačenih izuzetaka Funkcija iz prethodnog primera pod nazivom CitajPodatke() koja ponovo izbacuje prethodno uhvaćeni izuzetaka se poziva unutar try bloka. Pošto funkcija generiše izuzetak tipa FormatException , obrada izuzetaka se vrši za ovu klasu izuzetaka. Kada je izuzetak Y izbačen kao rezultat prethodno uhvaćenog izuzetka X tada Y. InnerExcePtion predstavlja referencu na izuzetak X. Dakle unutar catch bloka može se dobiti informacija o izuzetku koji je prethodno bio uhvaćen na prethodnom slajdu a zatim ponovo izbačen unutar try bloka.
|
Smatrate da je ova lekcija korisna? Preporučite je. | Broj preporuka:0 |