6. előadás Hatókör, láthatóság, élettartam. Változók leképzése a memóriára. Blokkszerkezetes nyelvek. Kivételkezelés.

Slides:



Advertisements
Hasonló előadás
Tömbök C#-ban.
Advertisements

Programozás III KOLLEKCIÓK 2..
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Öröklődés 2..
1.) A programfejlesztés hagyományos életciklus modellje és adattípus.
JavaScript.
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Csala Péter ANDN #4. 2 Tartalom  C# - ban előre definiált típusok  Változók  Változókkal műveletek  Elágazás  Ciklus.
Bevezetés a Java programozásba
5. előadás (2005. március 22.) Függvények definíciója, deklarációja, hívása Enumerációs adattípus 1.
4. előadás (2005. március 8.) Pointerek Pointer aritmetika
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Tömbök ismétlés Osztályok Java-ban Garbage collection
Függvények, mutatók Csernoch Mária.
Mutatók, tömbök, függvények
Java programozási nyelv 3. rész – Osztályok I.
6. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
Programozási nyelvek II. (Az Ada) Kocsisné Dr. Szilágyi Gyöngyi.
5. előadás Parametrikus polimorfizmus. Generikus programozás
2. előadás Programegység, fordítási egység, könyvtári egység, beágyazás, blokkszerkezet, alprogramok, csomagok.
Annotációk a Java 5 nyelvben Kozsik Tamás. Annotációk Módosítószavak bővítése A programszöveg elemeihez rendelhetők –Csomagokhoz, típusokhoz, metódusokhoz,
8. előadás Dinamikus memóriakezelés. Mutatók. Láncolt adatszerkezetek.
2. előadás Programegység, fordítási egység, könyvtári egység, beágyazás, blokkszerkezet, alprogramok, csomagok.
6. előadás Hatókör, láthatóság, élettartam. Változók leképzése a memóriára. Blokkszerkezetes nyelvek. Kivételkezelés.
5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
4. előadás Az Ada típusai és típuskonstrukciós eszközei, II. Rekordok és átlátszatlan típusok. A csomagok. Adatabsztrakció, egységbe zárás.
© Kozsik Tamás Csomagok. © Kozsik Tamás A program tagolása Típusdefiníciók (osztályok, interfészek) Metódusok Blokk utasítások Csomagok.
A JAVA TECHNOLÓGIA LÉNYEGE Többlépcsős fordítás A JAVA TECHNOLÓGIA LÉNYEGE Platformfüggetlenség.
7. előadás Paraméterátadás. Paraméterek az Adában. Túlterhelés
4. előadás Az Ada típusai és típuskonstrukciós eszközei, II
Kivételkezelés a C++ nyelvben Bevezetés
1.NET web szolgáltatások XSLT programozás XSLT hivatkozások Bilicki Vilmos
Összetett adattípusok
Alprogramok deklarációja, definíciója és meghívása Páll Boglárka.
Alprogramok paraméterei. Procedure ( ); Function ( ): ; [var] p1,...,pn:típus1; q1,...,q2:típus2; cím szerinti parméterátadaás (értékváltozás hatással.
Absztrakt adattípusok kAkAÓ Objektumorientált programozás. In: Nyékyné Gaizler Judit (szerk.): Programozási nyelvek, Kiskapu, Budapest, pp
Statisztikai módszerek áttekintése módszerválasztási tanácsok Makara Gábor.
A PHP 5 újdonságai Az OOP terén. Miről lesz szó? Osztályok kezelése – Új direktívák – Konstruktor – Destruktor Interfészek Kivételkezelés.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
Javascript Microsoft által készített kiegészítése Statikus típusosság Nagy projektek Windows 8 fejlesztésénél WinRT egy részét ebben írták Nyílt forráskódú,
Turbo Pascal Indítás: C:\LANGS\Turbo Pascal Turbo Pascal.
Java programozási nyelv Metódusok
Generics Krizsán Zoltán. Bemutató A.NET 2.0 verziótól. A.NET 2.0 verziótól. Típusparaméter Típusparaméter Más nyelvben ez a template (sablon). Más nyelvben.
Összetevő- és telepítési diagram
A Visual Basic nyelvi elemei
Funkciós blokkok A funkciós blokkok áttekintése Az alkalmazás előnyei.
HTML ÉS PHP (Nagyon) rövid áttekintés. ADATBÁZISRENDSZEREK MŰKÖDÉSI SÉMÁJA Felh. interakció DB Connector MySQL ? A gyakorlaton:
Függvények a C nyelvben 1 Függvényeket a következő esetekben szokás írni: Ha ugyanazt a tevékenységet többször is el kell végeznünk ugyanolyan típusú,
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 1 Osztály és objektum fogalma.
A 2. géptermi beszámoló VBA anyagának összefoglalása
5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
Függvények, mutatók Csernoch Mária. Függvények függvény definíciója az értelmezési tartomány tetszőleges eleméhez hozzárendel egy értéket –függvény helyettesítési.
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 4. gyakorlat.
Függvények, mutatók Csernoch Mária. Függvények függvény definíciója az értelmezési tartomány tetszőleges eleméhez hozzárendel egy értéket –függvény helyettesítési.
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
Programstruktúrák. Program A program utasítások olyan sorozata, amely a számítógépen önállóan képes megoldani egy feladatot. A program háttértáron futtatható.
A modell-ellenőrzés gyakorlata UPPAAL Uppsalai Egyetem + Aalborgi Egyetem közös fejlesztése; első verzió megjelenése; részei: - grafikus modellt.
Programozási nyelvek csoportosítása.
Programozási nyelvek típusossága.
Beépített függvények használata programozáskor
Beépített függvények használata programozáskor
12. hét, nov. 24: 2. géptermi beszámoló
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
I. Előadás bgk. uni-obuda
5. előadás Parametrikus polimorfizmus. Generikus programozás
Előadás másolata:

6. előadás Hatókör, láthatóság, élettartam. Változók leképzése a memóriára. Blokkszerkezetes nyelvek. Kivételkezelés.

2 Sablon (ismétlés) - Sablon: egy minta - alapján végrehajtható egyedek hozhatók létre (példányok) - a példányosítás mindig fordítási időben zajlik - sablon definíciója: - formális paraméterek megadása - sablon specifikációja - sablon törzse - példány megádasa (formális paramétek aktuálissal való helyettesítése) - több példány is létrehozható - minden példány önálló fordítási egység (alprogram sablon - meghívható alprogram ; csomag sablon - csomag)

3 Sablon (ismétlés)

4 FEJTÖRŐ a) Helyes sablon paraméterezések-e a következők? b) Mit jelentenek? 1. type T is (<>); 2. type T is range <>; 3. type T is range (<>); 4. with function " ; 5. with function " ); 6. with package Aritmetika is new Mátrix_Aritmetika <>; 7. with package Aritmetika is new Mátrix_Aritmetika(<>);

5 FEJTÖRŐ 1. type T is (<>); igen, diszkrét tipus 2. type T is range <>; igen, előjeles egész tipus 3. type T is range (<>);nem 4. with function " ; igen, fgv., paraméter, alap értékadással a "<„ jelnek 5. with function " ); nem 6. with package Aritmetika is new Mátrix_Aritmetika <>; nem 7. with package Aritmetika is new Mátrix_Aritmetika(<>); igen, ez egy csomag paraméter, ami egy csomagsablon példányaként van megadva

6 Néhány alapfogalom n Definíció n Deklaráció n Hatókör, láthatóság n Programegység n Blokkszerkezet

7 Definíció n Egy programentitás megadása, egy új entitás bevezetése n Változó, típus, programegység (alprogram, csomag, osztály stb.) n Például egy programegység definíciója: specifikáció és törzs – specifikáció: hogyan használhatom – törzs: hogyan működik

8 Deklaráció n „Bejelentés” n Egy entitáshoz egy nevet rendel n Ezzel a névvel lehet használni az entitást n A névvel jelölt entitás tulajdonságainak megadása (hogyan lehet használni) n Nem feltétlenül definiálja az entitást – Előre vetett deklaráció

9 Változódeklaráció int x;X: Integer; A változóhoz az x / X nevet rendeli n Gyakran definiálja is a változót (memóriaterületet rendel hozzá) Nem mindig definiál: extern int x; – az x-et int típusú változóként lehet használni

10 Típusdefiníció és típusdeklaráció n A típusdefiníció új típust vezet be type Int is new Integer; – ez itt egyben egy deklaráció is n A típusdeklaráció egy nevet vezet be egy típushoz typedef int integer; // szinoníma n Név szerinti vs. szerkezeti típusekvivalencia

11 Alprogram definíciója void swap( int& x, int& y ) { int z = x; x = y; y = z; } procedure Swap ( X, Y: in out Integer ) is Z: Integer := X; begin X := Y; Y := Z; end Swap; specifikáció törzs deklarációk is

12 Alprogram deklarációja n Nem kell a teljes definíció n Csak az, hogy hogyan kell használni – specifikáció n void swap( int& x, int& y ); n procedure Swap ( X, Y: in out Integer );

13 Deklaráció definíció nélkül (1) n Interfészek definiálásánál (osztály, csomag, modul) package Ada.Text_IO is … procedure Put(Item : in String); … end Ada.Text_IO; Csak deklaráljuk. A definíció a csomagtörzsben.

14 Hasonló a C/C++ nyelvekben #ifndef PROBA_H#include "proba.h" #define PROBA_Hint x; extern int x;int f ( int p ) { return x+p; } int f ( int p ); #endif /* PROBA_H */ #include "proba.h" int g( int t ) { x = 1; return f(t); }

15 Deklaráció definíció nélkül (2) n Kölcsönös rekurzió feloldása procedure B ( … ) is … end B, procedure A ( … ) is … begin … B(…); … end A; procedure B ( … ) is … begin … A(…); … end B;

16 Deklaráció definíció nélkül (3) n Ada: a renames utasítás. Szinoníma. – szöveg rövidítésére – nevek közötti konfliktusok feloldására – a végrehajtási idő csökkentésére n function Gcd ( A, B: Positive ) return Positive renames Lnko; n AI: Float renames A(I); … AI := AI + 1; -- elkerüljük az indexkifejezés többszörin kiértékelését

17 Definíció deklaráció nélkül n Ha nem adunk nevet a létrehozott entitásnak – funkcionális nyelvek: lambda-függvények – Java: névtelen osztályok n Ada: új típust definiálunk név nélkül type T is array (1..10) of Integer; V: T; -- adunk nevet X: array (1..10) of Integer; -- nem adunk nevet Y: array (1..10) of Integer;

18 Deklaráció hatóköre n Hatókör, hatáskör: scope n A deklaráció összekapcsol egy entitást egy névvel n Hatókör: – a programszöveg egy szakasza – amíg az összekapcsolás érvényben van n Ezen belül érhetjük el az entitást a névvel – Nem biztos, hogy elérjük, lásd láthatóság

19 Deklaráció láthatósága n Visibility n A hatókör része n Ahol a név az entitást azonosítja n Nem feltétlenül az egész hatókör n Elfedés (hiding) lehetséges

20 Elfedés { int x = 1; { int x = 2; cout << x << endl; } declare X: Integer := 1; begin declare X: Integer := 2; begin Put(X); end; n Két változó ugyanazzal a névvel

21 Kiterjesztett láthatóság procedure A is X: Integer := 1; begin declare X: Integer := 2; begin Put(X); Put(A.X); end; K: declare X: Integer := 1; begin B: declare X: Integer := 2; begin Put(X); Put(K.X); end B; end K; Minősített név

22 Hierarchikus felépítés n Egymásba ágyazunk programrészeket – programegységeket, utasításokat n Blokk – blokk utasítás – alprogram n A hatóköri, láthatósági szabályok alapja

23 Beágyazás n Programegységet egy blokk deklarációs részébe n Blokk utasítást egy blokk utasítássorozat-részébe procedure A is procedure B is … begin … end; begin declare procedure C is … begin … end; begin declare … begin … end; end;

24 Blokkszerkezetes nyelvek n Alprogramot beágyazhatunk alprogramba – Ilyen: Algol 60, Pascal, Ada, Haskell – Nem ilyen: C, C++, Java… n A nyelv megvalósítása szempontjából fontos kérdés – Később még visszatérünk rá…

25 Blokkok és hatókör n Egy blokk deklarációinak hatóköre a deklarációtól a blokk végéig tart n Beleértve a beágyazott blokkokat is procedure A is procedure B is … begin … end; begin declare procedure C is … begin … end; begin declare … begin … end; end;

26 Blokkok és láthatóság (1) procedure A is procedure B is … begin … end; … begin …-- Melyik résznél melyik B látható declare … procedure B is … begin … end; … begin … end; … end;

27 Blokkok és láthatóság (2) procedure A is procedure B is … begin … B; …end; … begin B; declare … procedure B is … begin … B; … end; … begin B; end; B; end;

28 Lokális és nonlokális deklaráció n Egy blokkban elhelyezett deklaráció lokális (local) a blokkra nézve – A blokkon kívülről nem hivatkozható n Egy külső blokkban elhelyezett deklaráció nonlokális (non-local) a befoglalt blokkok számára – Alternatív elnevezés: globális a befoglalt blokkra nézve declare X: Float; begin declare … begin … end; end;

29 Globális deklaráció n Eddig: lokális / nonlokális (globális) egy deklaráció egy blokkra nézve – relatív n Globális deklaráció: az egész programra vonatkozik – A hatóköre az egész program – abszolút int glo; void f ( int par ) { int loc = par; glo = loc; }

30 Lokális/nonlokális/globális változó n Az X egy – lokális változó, – nonlokális változó, – globális változó n Az X deklarációja olyan n Ugyanez más entitásokra is (alprogram, típus…)

31 Statikus és dinamikus hatókör n A programozási nyelvek többségében: statikus n Dinamikus: egy alprogramban a hivatkozásokat a hívás környezetében értelmezzük procedure A is procedure B is … begin … end B; procedure C is … begin B; end C; procedure D is procedure B is … begin … end B; begin C; end D; begin D; end A;

32 FEJTÖRŐ procedure P is A, B,C: Integer procedure Q is A, C: Integer procedure R is A: Integer begin -- közvetlenül látható nevek: P-beli Q és B, Q-beli R és C, R-beli A -- csak szelekciós hivatkozással megadható nevek: P.A, P.C, Q.A -- globális nevek: P, P.A, P.B, P.C, Q, Q.A, Q.C -- lokális nevek: R, A end R; begin -- közvetlenül látható nevek: -- csak szelekciós hivatkozással megadható nevek: -- globális nevek: -- lokális nevek: end Q; begin -- közvetlenül látható nevek: -- lokális nevek: end P;

33 FEJTÖRŐ procedure P is A, B,C: Integer procedure Q is A, C: Integer procedure R is A: Integer begin -- közvetlenül látható nevek: P-beli Q és B, Q-beli R és C, R-beli A -- csak szelekciós hivatkozással megadható nevek: P.A, P.C, Q.A -- globális nevek: P, P.A, P.B, P.C, Q, Q.A, Q.C -- lokális nevek: R, A end R; begin -- közvetlenül látható nevek: P-beli Q és B, Q –beli R, A ás C -- csak szelekciós hivatkozással megadható nevek: P.A, P.C -- globális nevek: P, P.A, P.B, P.C -- lokális nevek: Q, A, C, R end Q; begin -- közvetlenül látható nevek: P-beli Q, A, B, C -- lokális nevek: P, A, B, C, Q end P;

34 Változók élettartama n A program végrehajtási idejének egy szakasza n Amíg a változó számára lefoglalt tárhely a változójé n Kapcsolódó fogalmak – Hatókör – Memóriára való leképzés

35 Hatókör és élettartam n Sok esetben az élettartam az az idő, amíg a változó hatókörében vagyunk – Globális változó: az egész program végrehajtása alatt létezik – Lokális változó: csak a definiáló blokk végrehajtása alatt létezik n Nem mindig így van – „Dinamikusan” lefoglalt változók – C/C++ static változók, Java zárványok (inner)

36 Dinamikusan lefoglalt változók n Allokátorral lefoglalt tárterület n Mutatók, referenciák (egy későbbi előadás) n Lásd még: memóriára való leképzés

37 Deklaráció kiértékelése n Statikus (fordítás közben) – Rugalmatlan – C, C++ int t[10]; n Dinamikus (futás közben) – pl. Ada – A blokk utasítás szerepe

38 A blokk utasítás egyik haszna procedure A is N: Integer; begin Put("Hány adat lesz?"); Get(N); declare T: array (1..N) of Integer; begin -- beolvasás és feldolgozás end;

39 Egy másik haszon n Ha egy nagy tárigényű változót csak rövid ideig akarok használni n Egy blokk utasítás lokális változója n Ada: kivételkezelés

40 Változók leképzése a memóriára n Statikus – A fordító a tárgykódban lefoglal neki helyet n Automatikus – Futás közben a végrehajtási vermen jön létre és szűnik meg n Dinamikus – Allokátorral foglaljuk le, és pl. deallokátorral szabadítjuk fel (vagy a szemétgyűjtés…)

41 Statikus változók n Az élettartamuk a teljes program végrehajtása n Fordítási időben tárterület rendelhető hozzájuk n Tipikusan a globális változók – A hatókörhöz igazodó élettartam n De ilyenek a C/C++ static változók is n Egy futtatható program: kód + adat

42 Egy program a memóriában n Futtatás közben a program által használt tár felépítése: – kód – (statikus) adatok – végrehajtási verem – dinamikus tárterület (heap)

43 Dinamikus változók n Dinamikus tárterület – Ahonnan a programozó allokátorral tud memóriát foglalni – Explicit felszabadítás vagy szemétgyűjtés n Mutatók és referenciák n Utasítás hatására jön létre (és esetleg szabadul fel) a változó – Statikus és automatikus: deklaráció hatására

44 Végrehajtási verem n execution stack n Az alprogramhívások tárolására n Az éppen végrehajtás alatt álló alprogramokról aktivációs rekordok n A verem teteje: melyik alprogramban van az aktuálisan végrehajtott utasítás n A verem alja: a főprogram n Egy alprogram nem érhet véget, amíg az általa hívott alprogramok véget nem értek n Dinamikus (hívási) lánc

45 Aktivációs rekord n Activation record, stack frame n Egy alprogram meghívásakor bekerül egy aktivációs rekord a verembe n Az alprogram befejeződésekor kikerül az aktivációs rekord a veremből n Rekurzív alprogram: több aktivációs rekord n Az aktivációs rekord tartalma: paraméterek, lokális változók, egyebek – Blokkszerkezetes statikus hatókörű nyelvek esetén: tartalmazó alprogram

46 Automatikus változók n A végrehajtási veremben n A blokkok (alprogramok, blokk utasítások) lokális változói – ha nem static… n Automatikusan jönnek létre és szűnnek meg a blokk végrehajtásakor – A hatókörhöz igazodó élettartam n Rekurzió: több példány is lehet belőlük

47 Kivételek n A végrehajtási verem kiürítése – stack trace n Vezérlésátadás kivételes esetek kezelésénél n Kivétel: eltérés a megszokottól, az átlagostól – Programhiba (dinamikus szemantikai hiba) pl. tömb túlindexelése – Speciális eset jelzése n Kiváltódás, terjedés, lekezelés, definiálás, kiváltás

48 Nyelvi eszköz kivételkezelésre n A modern nyelvekben gyakori – Már a COBOL-ban és a PL/I-ben is (‘60) – Ada, C++, Java, Delphi, Visual Basic… – Sok „apró” különbség n Előtte (pl. Pascal, C) – Globális változók, speciális visszatérési értékek jelezték a kivételt – A kivétel észlelése: elágazás – Kusza kód

49 Szétválasztás n Az átlagos és a kivételes szétválasztandó n A kivételes események kezelését külön adjuk meg n Elkerülhető a kusza kód n Megbízható, mégis olvasható, karbantartható n Aspektuselvű programozás

50 Előre definiált kivételek az Adában n Constraint_Error (és Numeric_Error) n Program_Error n Storage_Error n Tasking_Error n A szabványos könyvtárak által definiált kivételek (pl. Ada.IO_Exceptions.End_Error)

51 Constraint_Error n Megszorítás megsértése procedure CE is I: Natural := 100; begin loop I := I-1; end loop; end CE;

52 Program_Error n Hibás programszerkezet procedure PE is generic procedure G; procedure P is new G; procedure G is begin null; end; begin P; end PE;

53 Storage_Error n Nincs elég memória procedure SE is type T( N: Positive := 256) is record H: Positive; Str: String(1..N); end record; V: T; begin … end SE;

54 Kivételek definiálása n A C++ esetében bármi lehet kivétel n A Java esetében egy speciális osztály és leszármazottai n Az Ada esetében spec. nyelvi konstrukció Hibás_Fájlnév: exception; Üres_A_Verem, Tele_A_Verem: exception;

55 Kivétel kiváltódása és terjedése n Egy utasítás végrehajtása közben váltódhat ki („fellép”) n A hívottból a hívóba terjed – A hívottban is fellép a hívás helyén n A végrehajtási verem mentén n Dobáljuk ki az aktivációs rekordokat n Ha a verem kiürül, leáll a program

56 Kivételek terjedése és a blokkok n Alprogramok – „Dinamikus tartalmazás” – Ha egy meghívott alprogramban fellép és nem kezeljük le, akkor fellép a hívó blokkban is a hívás helyszínén n Blokk utasítás – „Statikus tartalmazás” – Ha egy blokk utasításban fellép és nem kezeljük le, akkor fellép a tartalmazó blokkban is a tartalmazás helyszínén

57 Kivételek kezelése n C++ esetén: try-catch összetett utasítás n Ada: blokk kivételkezelő része – alprogram és blokk utasítás is lehet – a végén opcionális kivételkezelő rész – benne kivételkezelő ágak

58 Kivételkezelő rész alprogramban procedure A ( S: in out Stack; N: in out Natural ) is X: Positive; begin Push(S, N); Pop(S, X); exception when Constraint_Error => Push(S,N); N := 1; when Tele_A_Verem => null; end A;

59 Kivételkezelő rész blokk utasításban declare N: Positive := Lnko(64*43, 975); begin Put( N ); Get( N ); … exception when Constraint_Error => … end;

60 Kivételkezelő ágak n Egy ággal több, különböző kivételt is lekezelhetünk exception when Name_Error => Put_Line("Hibás fájlnevet adott meg!"); when End_Error | Hibás_Formátum => Close(Bemenet_fájl); Close(Kimenet_fájl); Put_Line("A fájl szerkezete nem jó."); end;

61 when others => n Az összes fellépő kivételt lekezeli n Azokat is, amelyek deklarációja nem látható n Veszélyes, de néha kell when others => null; n Az utolsó ág kell, hogy legyen exception when Constraint_Error => null; when others => Put_Line("Nem Constraint_Error."); end;

62 Nem deklarált kivételek és az others declare procedure A is X: exception; begin … end; begin A; exception when others => … end;

63 Kivételkezelő rész keresése n A kivétel terjedése mentén n Alprogram: hívó blokkban, Blokk utasítás: tartalmazó blokkban n A lekezelt kivétel nem terjed tovább – Hacsak újra ki nem váltjuk… n Ha nem találunk megfelelő kivételkezelőt – A végrehajtási vermet kiürítjük – A program hibaüzenettel végetér

64 Ha egy blokkban kivétel keletkezik n Az utasítások végrehajtása közben: – A blokkban lekezelhetjük egy kivételkezelő részben (a blokkban „lép fel”) n A deklarációk kiértékelése, vagy a kivételkezelő rész végrehajtása közben: – Csak a hívóban/tartalmazóban kezelhető le (ott „lép fel”)

65 Kivétel deklarációk kiértékelésekor declare V: T:= F(10); … begin … exception … end; a tartalmazó blokkban!

66 Kivételek kiváltása n C++, Java: throw utasítás n Ada: raise utasítás n Előre definiált és programozó által definiált kivétel is kiváltható n Kivételes szituáció kialakulásának jelzése

67 Ha nem tudok elvégezni egy műveletet (1) generic type Element is private; package Stacks is … Stack_Empty, Stack_Full: exception; … function Top ( S: Stack ) return Element; -- Top can raise Stack_Empty … end Stacks; előfeltétel

68 Ha nem tudok elvégezni egy műveletet (2) generic type Element is private; package Stacks is … Stack_Empty, Stack_Full: exception; … function Top ( S: Stack ) return Element; -- Top can raise Stack_Empty … end Stacks; előfeltétel csak megjegyzés

69 Ha nem tudok elvégezni egy műveletet (3) package body Stacks is … function Top ( S: Stack ) return Element is begin if Is_Empty(S) then raise Stack_Empty; else … end if; end Top; … end Stacks; az előfeltétel ellenőrzése

70 Mire használom a kivételeket? n Kivételes eset jelzésére – Előfeltétel nem teljesült – Valami elromlott menet közben (pl. hálózati kapcsolat megszakadt) n Kivételes eset lekezelésére – Tovább futhasson az alkalmazás – Kilépés előtt valamit csináljak még (log-olás, erőforrások elengedése)

71 Kivétel újrakiváltása n Biztonságos menekülés declare … begin adatok kiírása az F fájlba exception when Constraint_Error => Close(F); raise; end;

72 Kivétel lecserélése package body Stacks is … function Top ( S: Stack ) return Element is begin return S.Data( S.Stack_Pointer ); exception when Constraint_Error => raise Stack_Empty; end Top; … end Stacks; ha üres Szétválasztás

73 Kivétel, mint vezérlési szerkezet type Napok is (Hetfő, Kedd, Szerda, … Vasárnap); function Holnap ( Ma: Napok ) return Napok is begin return Napok’Succ(Ma); exception when Constraint_Error => return Napok’First; end;

74 Többletinformáció a kivételes esetről n C++ és Java esetében a kivétel plussz információkat tárolhat, hordozhat n Ada 95: kivételpéldányok – korlátozott lehetőség – csak szöveges adat (hibaüzenet) – az Ada.Exceptions csomag

75 Az Ada.Exceptions csomag with Ada.Exceptions; use Ada.Exceptions;... exception when E: Stack_Full => Close(F); Put_Line( Standard_Error, Exception_Message(E) ); Raise_Exception( Exception_Identity(E), -- egy kivétel példány melyik kivételnek a példánya Exception_Message(E) & "(logged)" ); -- rövid ismertetőt ad a kivétel példányról...

76 Kivétel sablon paramétereként (1) with Ada.Exceptions; use Ada.Exceptions; generic type Elem is limited private; type Index is (<>); type Tömb is array (Index range <>) of Elem; with function " ; Üres_Tömb: Exception_Id := Constraint_Error ' Identity; function Max ( T: Tömb ) return Elem;

77 Kivétel sablon paramétereként (2) function Max ( T: Tömb ) return Elem is begin if T ' Length = 0 then Raise_Exception( Üres_Tömb, "Üres a tömb" ); else declare Mh: Index := T ' First; begin... end; end if; end Max; opcionális, itt most nem szerencsés

78 Kivétel sablon paramétereként (3) with Max; procedure Max_Demo is type T is array (Integer range <>) of Float; Baki: exception; function Float_Max is new Max(Float,Integer,T); function Float_Min is new Max( Float, Integer, T, ">", Baki ' Identity ); X: T(1..0); -- üres tömb begin...