Upravljanje iznimkama

Upravljanje iznimkama (eng. exception handling) je proces odgovaranja na pojavu nepravilnosti tijekom računanja u računalu. Ove anomalije ili iznimni uvjeti zahtijevaju posebnu obradu. To je obično promjena uobičajenog tijeka izvršavanja programa. To pružaju specijalizirani konstrukti programskog jezika ili mehanizmi računalnog sklopovlja. Općenito, iznimkom se upravlja odnosno rješava ju se snimanjem sadašnjeg stanja izvršenja na prethodno određenom mjestu i prebacivanjem izvršenja na posebni potprogram (subrutinu) znanu kao upravitelj iznimkama (eng. exception handler). Ako su iznimke neprekidne, upravitelj može se vratiti na izvršenje na izvorno mjesto služeći se snimljenim podatcima.

Knjižnica izvršavanja često sadrži ugrađene funkcije za upravljanje memorijom ili iznimkama.[1]

Iznimke se mogu javiti u različitim okolnostima. Primjerice u pregledniku postavke sadržaja mogu nešto dopuštati, ali dodavanjem iznimke ponašanje postavki može promijeniti ponašanje na pojedinačnoj lokaciji.[2] Iznimkama se upravlja tako što se pravilima dodaju opisane iznimke za te posebne okolnosti. To može biti kada se poruku obilježi zastavicom za daljnji rad ili joj se dodijeli oznaku visoke važnosti. Tad je dovoljno da se samo jedna od određenih iznimki ispuni i pravilo se ne primjenjuje.[3]

U klasičnom pristupu programiranju pojava pogreške rezultira prekidom izvođenja programa, vraćanja statusa pogreške no najčešće nema posebnog mjesta za vraćanje statusa ili funkcija vraća i podatak i status na istom mjestu – što je loše. Može se pojaviti primjerice EOF (vrijednost manja od nule), "zloporaba" povratne vrijednosti ili nekakvi spetljani kod.[4]

U suvremenom pristupu, noviji programski jezici uveli su pojam iznimke (primjer C++). Iznimka opisuje tu iznimnu situaciju. Ako metoda regularno završi onda sigurno vraća podatak te nema razloga da povratni tip bude pogrešan. Dogodi li se pogreška tijekom izvođenja metode, izazvat će se iznimna situacija koja će biti opisana prikladnim objektom. Taj objekt nazivamo iznimkom i sadrži detaljnije informacije o razlogu nastanka iznimne situacije.[4]

Programski jezik Java za opis iznimne situacije koristi primjerke klase Throwable ili klasa koji su iz nje (direktno ili indirektno) izvedeni. Ta klasa omogućava pristup podatcima kao što su cjelokupno stanje na stogu u trenutku kada je nastala iznimna situacija, točna lokacije iznimke u kodu (koja datoteka, koji redak) za svaku metodu, poruka pogreške i pristup do “omotane” iznimke, ako takva postoji. Omogućava i pristup metodama poput metode printStackTrace za ispis svih informacija na standardni izlaz za pogreške, a klase izvedene iz klase Throwable dodavat će druge prikladne informacije ovisno o vrstama iznimnih situacija koje opisuju. Iznimku se može obraditi ovako: kôd u kojem se može očekivati iznimka stavimo u try blok iza kojeg slijedi catch blok s kôdom koji služi za obradu iznimke. Ovisno o vrstama iznimaka koje se očekuju, piše se jedan ili više catch blokova. Redoslijed tih blokova je bitan, jer se po nastupanju iznimne situacije ispitivanje provodi od prvog bloka catch. Prvi blok koji deklarira obradu iznimke koja je „kompatibilna” s nastalom iznimkom bit će odabran za izvođenje, a ako takvog nema, iznimka se propagira dalje. Nakon izvođenja catch bloka, program se nastavlja s prvom naredbom koja slijedi iza čitave try-catch strukture. Nema povratka u try blok, jer iznimka nije nalik pozivu metode. Kod više mogućih iznimaka, u slučaju da se obrada više vrsta iznimaka obavlja na identičan način, umjesto kopiranja obrade u više blokova možemo koristiti multi-catch.[4] Neovisno o tome da li je došlo do iznimke ili ne, ponekad treba obaviti dio kôda koji će predstavlja završno čišćenje resursa. Moguć je i blok try – finally, bez bloka catch. Kôd u bloku finally uvijek će se izvršiti, neovisno je li nastala iznimka u dijelu try, ali nema koda za obradu iznimke, pa se propagira dalje i eventualna nova iznimka u finally bi maskirala originalnu. Jezici koji nemaju automatsko upravljanje memorijom, ovakav mehanizam oporavka od pogrešaka može dovesti do problema curenja memorije. Zbog toga u starijim inačicaam jezika C++ mehanizam iznimaka nije bio korišten u većoj mjeri. Budući da programski jezik Java ima automatsko skupljanje smeća, ovo više nije problem.[4] Programer u Javi i sam može izazvati iznimnu situaciju. Za to je potrebno stvoriti prikladan primjerak razreda koji opisuje nastalu iznimnu situaciju a potom pokrenuti postupak obrade iznimne situacije uporabom ključne riječi 'throw. Isto tako, ako je potrebno obaviti neku akciju prije no što se obrada iznimke proslijedi dalje, iznimku je moguće uhvatiti, napraviti potrebnu akciju pa ponovno aktivirati.[4]

Također ako metoda ne može smisleno obraditi iznimku, a također je ne može baciti iz metode (jer primjerice ne smijemo mijenjati signaturu metode), originalnu iznimku možemo zamotati. Do omotane iznimke može se doći pozivom metode getCause() koja je definirana u razredu Throwable.[4]

Programski jezik Java iznimne situacije dijeli u tri velike porodice. Neformalni nazivi su:

  • grube pogreške (errors) – Klasa Error i njeno podstablo modelira opise iznimnih situacija od kojih se ne očekuje da je moguć oporavak. Većina programa u Javi nikad ne obrađuje ovakve pogreške.[4]
  • neprovjeravane iznimke (runtime exceptions) – Česte su i očekivane. Modeliraju situacije koje se mogu javiti praktički na svakom koraku izvođenja programa. Od ovih se situacija očekuje moguć oporavak. Izvedene su iz klase RuntimeException (koja je direktni potomak klase Exception). Nije nužno ugraditi upravljanje ovakvim iznimkama niti eksplicitno naglašavati da postoje metode koje mogu izazvati ovakve iznimne situacije.[4]
  • provjeravane iznimke (checked exceptions) – Izvedene iz klase Exception. Modeliraju situacije koje nisu fatalne po aplikaciju (oporavak je moguć), ali ih se mora eksplicitno obrađivati ili naglasiti da se prosljeđuju dalje.[4]

Izvori uredi

  1. Internals of the GNU compilers, Chapter 4. The GCC low-level runtime library. gnu.org. Pristupljeno 30. prosinca 2013.
  2. Chrome pomoć – Upravljanje iznimkama. support.google.com. Pristupljeno 8. listopada 2016.
  3. Upravljanje porukama pomoću pravila – Outlook. support.office.com. Pristupljeno 8. listopada 2016.
  4. a b c d e f g h i FER Repozitorij. Objektno orijentirano programiranje. 8. Upravljanje pogreškama. Zaštićeno licencom http://creativecommons.org/licenses/by-nc-sa/3.0/hr/ , 2. studenoga 2015. (pristupljeno 8. listopada 2016.)