014 izuzeci
TRANSCRIPT
-
8/19/2019 014 Izuzeci
1/38
1
MEHANIZMI ZA OBRADU
IZUZETAKA
-
8/19/2019 014 Izuzeci
2/38
2
Pojam izuzetka Pojam izuzetka
Izuzetak je događaj koji onemogućava regularno izvršenje
programa.
Izuzetak treba posebno obraditi izvan osnovnog toka
programa. Primeri:
U izrarzu se pojavilo deljenje nulom,
Pri rezervaciji memorijskog prostora, u dinamičkoj zonimemorije nije bilo dovoljno mesta,
ošlo je do prekoračenja opsega pri pristupu elementima niza, !ksterni uredjaj sa kojeg se čitaju podaci je u kvaru,
ošlo se do kraja datoteke iz koje se čitaju podaci...
-
8/19/2019 014 Izuzeci
3/38
3
Reakcija na standardne izuzetke Reakcija na standardne izuzetke
Mnogi računarski sistemi imaju harderske mogu!nostida generi"u signa#e kojima reaguju na odre$ene gre"kekoje nastaju u toku i%r"aanja &rograma' Na &rimer(&ojaa &rekora!enja u toku i%r"aanja aritmeti)kiho&era)ija( de#jenje nu#om i s#'
*rogramski je%i)i su o+ično rea#i%oani tako da u takimsitua)ijama do#a%i do &rekida &rograma( kontro#a se
&renosi o&eratinom sistemu koji o+ično "tam&aodgoaraju!u &oruku i &rekida da#je i%r"aanje&rograma'
-
8/19/2019 014 Izuzeci
4/38
4
Reakcija na standardne izuzetke Reakcija na standardne izuzetke
U slučaju ulazno izlaznih operacija situacija je neštodrugačija. Na primer,u programskom jezikuF!"!#N postoji mogu$nost da se u ok%iru !'
nared(e de)iniše la(ela na koju se prenosiupra%ljanje kada se u toku iz%rša%anja o%e nared(edo*e do kraja datoteke koja se čita.
+sti mehanizam je iskoriš$en da se de)iniše odgo%orsistema na greške koje mogu da nastanu u toku
iz%rša%anja !' nared(e. Na primer u nared(i
READ,UNIT-.(/TM-0111(ERR-011(END-2223
-
8/19/2019 014 Izuzeci
5/38
-
Tehnike za obradu izuzetakaTehnike za obradu izuzetaka
od no%ijih programskih jezika razradjenisu mehanizmi za /rih%atanje standardnih hard%erskih izuzetaka i
'e)inisanje i o(radu so)t%erskih izuzetaka.
od starijih programskih jezika o%i su se pro(lemi o(ično reša%ali pomo$u
oriš$enja statusnih promenlji%ih i /otprograma koji se akti%iraju u odre*enim
situacijama.
-
8/19/2019 014 Izuzeci
6/38
0
Tehnike za obradu izuzetakaTehnike za obradu izuzetaka
"ehnika zasno%ana na koriš$enju statusnih parametara /otprogramu se dodaje ekstara parametar koji nosi in)ormaciju o
statusu odre*enog doga*aja.
ada nastane doga*aj koji se kontroliše taj parametar menja
%rednost. /ri po%ratku iz potprograma u%ek se ispituje %rednost statusnog
parametra
Nedostaci o%e tehnike od postaje jako nepregledan gomilaju se i) nared(e za
ispiti%anje statusnih promenlji%ih /ropagacija izuzetka kroz %e$i (roj pozi%anih procedura zahte%a
ispiti%anje statusnog parametra u s%akoj proceduri.
-
8/19/2019 014 Izuzeci
7/38
Tehnike za obradu izuzetakaTehnike za obradu izuzetaka
'ruga mogu$nost je da se u potprogramu koristi parametar oznaka, kao u slučaju !' nared(e iz
F!"!#N5a.
"o omogu$a%a da se izlaz iz potprograma razlikuje zaslučaj kada se program normalno iz%rša%a i za slučaj kada
je nastao izuzetak koji se kontroliše.
6e*utim, kod jezika sa dinamičkom implementacijom
o%a tehnika se ne mo7e koristiti jer ote7a%a manipulisanjesa run5time stekom z(og toga što se tačke izlaska iz
potprograma razlikuju u za%isnosti od situacije nastale u
toku iz%rša%anja programa.
-
8/19/2019 014 Izuzeci
8/38
8
Tehnike za obradu izuzetakaTehnike za obradu izuzetaka
"re$a mogu$nost je da postoji potprogram za o(radu
izuzetaka kao od%ojen modul i da se kao parametar
prenosi u potprograme u kojima se kontroliše
odre*eni izuzetak.
sno%ni nedostatak kod o%ak%og pristupa je u tome
što se pri s%akom pozi%u mora prenosiiti i taj
potprogram koji o(ra*uje izuzetak. #ko u jednom potprogramu kontrolišemo %iše izuzetaka kod
postaje pretrpan tak%im elementima.
-
8/19/2019 014 Izuzeci
9/38
9
Struktura programa sa kodomStruktura programa sa kodom
za obradu izuzetaka. za obradu izuzetaka.procedure primer"
....
#$%! :U'()*)+"
....
return "--od za obradu izuzetka
....
when zero-divide do
#$%! :&/"print 012reška 3 4e moze se izracunati srednja vrednost15"
print 01)*)+ je nula15
end "
....
end primer"
-
8/19/2019 014 Izuzeci
10/38
1:
Upravljanje izuzecimaUpravljanje izuzecima
Kod programa
...
+egin
.....
Neka naredba
.....
end4
Aktiviranje izuzetka
Kod za obradu
izuzetka5hen
+egin
....
end4
5hen+egin
....
end4
'''''
5hen+egin
....
end4?
?
Kraj programa
-
8/19/2019 014 Izuzeci
11/38
11
PL! PL!
orisničke sek%ence koda za o(radu izuzetaka uo%om jeziku imaju o(lik (loka nared(i
N +me5izuzetka ;&
-
8/19/2019 014 Izuzeci
12/38
12
PL! PL!
"ako*e, postoji mogu$nost de)inisanja korisničkih
so)t%erskih izuzetaka koji se kreiraju pomo$u
>N'+"+N +me5izuzetka.
orisnički izuzeci moraju da se akti%iraju podignu
eksplicitno, što se posti7e nared(om
?+N'+"+N +me5izuzetka
-
8/19/2019 014 Izuzeci
13/38
13
AdaStandardni izuzeci AdaStandardni izuzeci
>N?"!#+N"A&!!! B #kti%ira se u slučaju izlaska iz
opsega %rednosti nekog diskretnog tipa podataka range
constraint , upotre(e indeksa %an dimenzija polja indeC
constraint i sl. /r6 : integer range 7..8/"
a : array 07..7/5of integer"
.....
6:&9/"-- 6 dobija vrednost van opsega tipa
6 :& a065"
--aktivira se izuzetak kada 6 nije u opsegu 7..7/, ali i
kada a065 nije u opsegu 7..8/.
-
8/19/2019 014 Izuzeci
14/38
14
AdaStandardni izuzeci AdaStandardni izuzeci
NU6&!+>A&!!! 5 akti%ira se hard%erski u slučaju
poja%e greške u iz%rša%anju numeričkih operacija kao
što su podkoračenja i prekoračenja ili deljenje sa nulom.
/!
semantičlke greške u toku iz%rša%anja programa, na
primer kada se koristi promenlji%a kojoj nije
inicijalizo%ana %rednost.
-
8/19/2019 014 Izuzeci
15/38
1-
AdaStandardni izuzeci AdaStandardni izuzeci
?"!#
-
8/19/2019 014 Izuzeci
16/38
10
AdaUpravljanje izuzecima AdaUpravljanje izuzecima
4aredba za privatanje izuzetaka u +di
begin
-- od koji se nadgleda
exceptionwhen ImeIzuzetka1 &; Naredba1"
when ImeIzuzetka2 &; Naredba2 "
<
end"
-
8/19/2019 014 Izuzeci
17/38
1
AdaUpravljanje izuzecima AdaUpravljanje izuzecima
function =+)*%I! 04:in I4)!2!%5 return=*+) is
=+):=*+) :&7./"
begin
for I in 8..4 loop=+) :&=+) >=*+)0I5"
end loop "
return =+)"
exception
when 4U'!%I?@!%%*% &;
return =*+)+#)"
end =+)*%I!"
-
8/19/2019 014 Izuzeci
18/38
18
AdaSo"tverski izuzeci AdaSo"tverski izuzeci
program #*=)$!%#I @IAUA!?I is
2%!#+:exception "--*pis izuzetka
begin
....
raise 2%!#+"--+ktiviranje izuzetka"
....
exceptionwhen 2%!#+ &;
--od za upravljanje izuzetkom
....
end "
-
8/19/2019 014 Izuzeci
19/38
19
AdaSo"tverski izuzeci AdaSo"tverski izuzeci
exceptionwhen 2%!#+@7 &;--eo koda koji se ispunjava kada je aktivirana2%!#+@7"when 2%!#+@8 &;
--eo koda koji se ispunjava kada je aktivirana2%!#+@8"....when 2%!#+@k &;--eo koda koji se ispunjava kada je aktivirana
2%!#+@k"when others &;--eo koda koji se ispunjava kada je aktiviran bilo kojiizuzetak--koji nema posebno upravljanje"end "
-
8/19/2019 014 Izuzeci
20/38
2:
AdaSo"tverski izuzeci AdaSo"tverski izuzeci
with )!B)@I*"use )!B)@I*"
procedure 2%+!@!#?%IP)I*4 is
package I4)!2!%@)!B)@I* is new I4)!2!%@I*
0I4)!2!%5"use I4)!2!%@)!B)@I*"
=%!C:array 07..7/5of I4)!2!%"
4!D@2%+!,I4!B,I'I)@7,I'I)@8 :I4)!2!%"
begin loop
2!)04!D@2%+!5"
I4!B :&4!D@2%+! (7/ E7"
-
8/19/2019 014 Izuzeci
21/38
21
AdaSo"tverski izuzeci AdaSo"tverski izuzeci
begin
=%!C0I4!B5:&=%!C0I4!B5E7"
exception
when ?*4#)%+I4)@!%%*% &;
if 4!D@2%+! &7//then =%!C07/5:&=%!C07/5E7"
else
PU)01!%%*% --neF grade:15"
PU)04!D@2%+!5"PU)01is out oG range15"
4!D@I4!"
end if "
end "end loop "
-
8/19/2019 014 Izuzeci
22/38
22
AdaSo"tverski izuzeci AdaSo"tverski izuzeci
exceptionwhen !4@*=@=I! &;
PU) 01imits =reHuenc15"
4!D@I4!"4!D@I4!"
for I4!B in / ..J
loop
I'I)@7 :&7/ >I4!B"
I'I)@8 :&I'I)@7 EJ"
if I4!B &J
then I'I)@8 :&7//"
end if "
PU)0I'I)@75"PU)0I'I)@85"
PU)0=%!C0I4!B55"
4!D@I4!"
end loop "
end 2%+!@I#)%IKU)I*4"
-
8/19/2019 014 Izuzeci
23/38
23
AdaPreno#enje izuzetaka AdaPreno#enje izuzetaka
procedure !B?@!'* isprocedure +)I$I%+4L! is
begin
put01Izuzetak je aktiviran15"
raise ?*4#)%+I4)@!%%*%"
--U potprogramu ne postoji e6ception kod
--Izuzetak se prenosi na pozivajuMI modul"
end "
procedure UP%+$L+4L! is
begin
put 01Pocetak potprograma za upravljanje izuzetkom15"
+)I$I%+4L!"--Poziv potprograma za aktiviranje izuzetka"exception
when ?*4#)%+I4)@!%%*% &;
put01od za upravljanje izuzetkom15"
end "
-
8/19/2019 014 Izuzeci
24/38
24
AdaPreno#enje izuzetaka AdaPreno#enje izuzetaka
+egin putD
-
8/19/2019 014 Izuzeci
25/38
2-
$elphi%&ception hendling block $elphi%&ception hendling block
"ipična struktura (loka za upra%ljanje izuzecima (ila (itry
Nstatements ou Fant to protect O
except
Ne6ception-andling statements O
finally
N O
end "
%&cept deo (loka za upra%ljanje izuzecima sastoji se od po jedne
nared(e za s%aki tip izuzetka kojim se upra%lja. %e nared(e seiz%rša%aju kada se dogodi odre*eni izuzetak nared(a prih%ata
izuzetak, a pišu se prema slede$oj sintaksi
on tpe oG e6ception;do statement;"
-
8/19/2019 014 Izuzeci
26/38
20
$elphiPrimer $elphiPrimer
function
2et+verage0#um,4umber*GItems:Integer 5:
Integer"begin
try
%esult :um div 4umber*GItems"
except
on !ivKAero do %esult :&/"
end "
end ;
-
8/19/2019 014 Izuzeci
27/38
2
$elphiSo"tverski izuzeci $elphiSo"tverski izuzeci
U programu mo7emo de)inisati s%oj tip izuzetaka kao
t8&e&6J&Cception Gclass&Cception
%aka% izuzetak se eksplicitno mo7e akti%irati nared(om
raise &6J&Cception
-
8/19/2019 014 Izuzeci
28/38
28
$elphiSo"tverski izuzeci $elphiSo"tverski izuzeci
'primer('primer(type
!PassFordInvalid &class0!6ception5"
%ako de)inisani izuzetak se akti%ira sledeKom nared(om
if PassFord ;?orrectPassFord then
raise !PassFordInvalid.?reate0QIncorrect passFord
enteredQ5"
-
8/19/2019 014 Izuzeci
29/38
29
$elphi)sloba $elphi)sloba* * anje resursaanje resursa
'tr+"inall+('tr+"inall+('a (i se postiglo korektno oslo(a*anje memorije u slučaju poja%e
nekog izuzetka u 'elphi5ju postoji mogu$nost da se kod za
oslo(a*anje resursa zaštiti u ok%iru pose(nog (loka.
"ipična struktura (loka za zaštitu resursa sastoji se od trJ 5delakoji o(uh%ata nared(e koje koriste resurs i )inallJ 5dela kojim se
o(uh%ataju nared(e za oslo(adanje resursa
Ldodelji%anje resursa K
tr8
Lnared(e koje koriste resurs K
9ina##8
Loslo(adanje resursa K
end
-
8/19/2019 014 Izuzeci
30/38
3:
$elphi)sloba $elphi)sloba* * anje resursaanje resursa
'tr+"inall+('tr+"inall+(/oenta u trJ5)inallJ (loku je u tome što se kodo(uh%a$en u )inallJ Bdelu u%ek iz%rša%a, kako u toku
normalnog toka programa, tako i u slučaju poja%e
izuzetka.ada se u toku iz%rša%anja nared(i u trJ 5delu ili unutar
potprogra ma koji se pozi%aju iz o%og dela poja%i
izuzetak,upra%ljanje tokom programa se automatski
prenosi na kod u )inallJ delu.
#ko se u toku iz%rša%anja trJ dela koda ne poja%i
izuzetak, program se normalno za%rša%a kodom u )inallJ
delu.
-
8/19/2019 014 Izuzeci
31/38
31
$elphi,a $elphi,a # # tita resursatita resursa
'primer('primer(procedure )=orm7.Kutton7?lick0#ender :)component 5"
var
+pointer :Pointer"
+nInteger,+dividend :Integer"
begin +ividend :&/"
2et'em0+Pointer,7/8R 5"Ndodela memorije O
try
+nInteger :&7/ div +ividend" Nizuzetak -deljenje sa nulom O
finally=ree'em0+Pointer,7/8R 5"Noslobadanje memorije O
end "
end "
-
8/19/2019 014 Izuzeci
32/38
32
-AA izuzeci -AA izuzeci
:intaksa +#oka %a o+radu i%u%etaka;
try N
(>tr-blok >(
Ocatch 0!6ception)pe e75N
(>catc-blok za prvi tip izuzetaka >(
O
catch 0!6ception)pe e85N
(>catc-blok za drugi tip izuzetaka >(O
<
finally {
(> blok koji se izvrsava I kada jeste I kada nije bilo izuzetaka >(
O
-
8/19/2019 014 Izuzeci
33/38
33
-AA primer -AA primer
void Frite#tuGG 0#tring stuGG,#tring more#tuGG5N
try N
Frite)o=ile0stuGG5"
Frite)o=ile0more#tuGG5" O
catch 0!6ception e5
N
e.print#tack)race05" return "
O
O
-
8/19/2019 014 Izuzeci
34/38
34
-AA -AA aktiviranje izuzetkaaktiviranje izuzetka
=a akti%iranje izuzetka u a%i se koristi thro7
nared(a čiji je argument o(jekat neke klase
izuzetaka tj. o(jekat klase koja je direktno ili
indirektno iz%edena iz klase &Cception.
/rimerclass '!6ception extends !6ception
N
<
O
throw neF 'oj!6ception05"
-
8/19/2019 014 Izuzeci
35/38
3-
-AA -AA propagiranje izuzetka propagiranje izuzetka
Ukoliko u )unkicji postoji nared(a koja prija%ljujeizuzetak, %an trJ5catch strukture koja taj tip izuzetkao(radjuje, ka7e se da )unkcija prija%ljuje izuzetak.
Ukoliko )unkcija mo7e da prija%i izuzetak, nakon zagla%lja)unkcije piše se opis
thro7s Lista$ozvoljenihTipova/zuzetaka
-
8/19/2019 014 Izuzeci
36/38
30
-AA -AA propagiranje izuzetka propagiranje izuzetka
'primer('primer(void Frite)o=ile0#tring podatak5troFs !6ception
N
if 0Gile@ne@postoji5N
throw new =ile4ot=ound!6ception05"
O
elseN
(>upisati podatak u datoteku >(
O
-
8/19/2019 014 Izuzeci
37/38
3
-AA -AA propagiranje izuzetka propagiranje izuzetka
'primer('primer(void Frite#tuGG0#tring stuGG, #tring more#tuGG5N
try
N Frite)o=ile0 stuGG 5"
Frite)o=ile0 more#tuGG 5"
O
catch( !6ception e 5N
e.print#tack)race05"
O
-
8/19/2019 014 Izuzeci
38/38
38
-AA primer -AA primer kori#0enjakori#0enja "inall+ "inall+
blokabloka=ile Gile"try NGile &new =ile01atoteka15Gile.Frite01Goo15"
Gile.Frite01bar15"Ocatch 0I*!6ception e5N
(>jedan od >(
return "((izvršava se Ginall blokOfinally N
Gile.close05"O
O