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
C# nyelvi áttekintő A „Programozás C# nyelven (Illés Zoltán)”
Advertisements

PL/SQL folytatás Kurzorok Alprogramok Tárolt eljárások ADATBÁZIS ALAPÚ RENDSZEREK.
PL/SQL I. ADATBÁZIS ALAPÚ RENDSZEREK.  PL/SQL = Procedural Language/SQL  utasítást ; zárja le  PL/SQL blokk lezárása: /  kis- és nagybetű egyenértékű.
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke A programozás alapjai 1. (VIEEA100) 9. előadás.
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
Bevezetés a Java programozásba
7. előadás (2005. április 12.) Láncolt lista File kezelés 1.
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.
Fájlkezelés, IO Kivételkezelés Belső osztályok
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 9. Gyakorlat Alap file műveletek.
Programozás II. 3. Gyakorlat C++ alapok.
A CLIPS keretrendszer CLIPS "C" Language Integration Production System.
Mutatók, tömbök, függvények
A Java programozási nyelvSoós Sándor 1/17 Java programozási nyelv 4. rész – Osztályok II. Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.
Java programozási nyelv 3. rész – Osztályok I.
Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő:
ORACLE ORDBMS adminisztrációs feladatok 6. rész dr. Kovács László 2004.
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.
C++ Alapok, első óra Elemi típusok Vezérlési szerkezetek
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.
Az Input-Output használata Az input-outputot a nyelv előredefiniált csomagokon keresztül valósítja meg. Mindegyik csomag az Ada alapcsomag gyereke.
8. előadás Dinamikus memóriakezelés. Mutatók. Láncolt adatszerkezetek.
3. előadás Típusrendszerek
2. előadás Programegység, fordítási egység, könyvtári egység, beágyazás, blokkszerkezet, alprogramok, csomagok.
Programozási nyelvek I. (Az Ada) Kozsik Tamá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 Kivételek A program végrehajtása során ritkán bekövetkező események Nem a „fő végrehajtási ág”; logikailag alacsonyabbrendű feladat.
© 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.
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
PHP I. Alapok. Mi a PHP? PHP Hypertext Preprocessor Szkriptnyelv –Egyszerű, gyors fejlesztés –Nincs fordítás (csak értelmező) Alkalmazási lehetőségek:
P ROGRAMOZÁS C# - BAN Kivételkezelés. P ÉLDA I. Nullával való osztás miatt kapjuk a hibaüzenetet.
Programozási nyelvek összehasonlító elemzése
Programozási Nyelvek (C++) Gyakorlat Gyak 02.
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.
2012. tavaszi félév Vitéz Gergely. A diasor ismerete nem helyettesíti a tankönyvet, és a példatárat. A diasor ismerete szükséges, de nem elégséges feltétele.
Tömbök és programozási tételek
Hernyák Zoltán Programozási Nyelvek II.
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ú,
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.
Egyenesvonalú (lineáris) adatszerkezetek
Adatbázis rendszerek II
A Visual Basic nyelvi elemei
Programozás III KIVÉTEL.
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ú,
C Programozási alapok.
Programozás III KIVÉTEL. KIVÉTELKEZELÉS Hibátlan program nincs!!! eddig hiba esetén leállt a program. Példa ilyen hibákra: ─ ArrayBoundsOfException (tömb.
Kiterjesztések szemantikája: Szemantikai tartomány : Adatoknak, vagy értékeknek egy nem üres halmazát szemantikai tartománynak nevezzük. Jelölése: D. Egy.
5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás I. 7. gyakorlat.
Excel programozás (makró)
Az 5,6,7 laborok VBA anyagának összefoglalása
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Utasítás és blokk. Elágazás típusai, alkalmazása Kovács.
Programozási nyelvek típusossága.
A CLIPS keretrendszer
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Függvénysablonok használata
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 Néhány alapfogalom n Definíció n Deklaráció n Hatókör, láthatóság n Programegység n Blokkszerkezet

3 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

4 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ó

5 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

6 Típusdefiníció és típusdeklaráció n A típusdefiníció új típust vezet be type Int is new Integer; Tömb: array (1..0) of Float; 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

7 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

8 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 );

9 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.

10 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); }

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

12 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;

13 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..0) of Integer; V: T; X: array (1..10) of Integer; Y: array (1..10) of Integer;

14 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

15 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

16 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

17 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

18 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

19 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;

20 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á…

21 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;

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

23 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;

24 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;

25 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; }

26 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…)

27 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;

28 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

29 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)

30 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

31 Ha a hatókör kisebb az élettartamnál int sum ( int p ) { static int s = 0; s += p; return s; }void f ( void ) { cout << sum(10) << endl; cout << sum(3) << endl; }

32 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

33 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;

34 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

35 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…)

36 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

37 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)

38 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

39 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

40 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

41 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

42 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

43 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

44 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

45 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)

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

47 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;

48 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;

49 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;

50 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

51 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

52 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

53 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;

54 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;

55 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;

56 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;

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

58 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

59 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”)

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

61 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

62 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

63 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

64 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

65 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)

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

67 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

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

69 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

70 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), Exception_Message(E) & "(logged)" );...

71 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;

72 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

73 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...

74 Kivételek elnyomása with Ada.Text_IO; use Ada.Text_IO; procedure Szoroz is pragma Suppress(Range_Check); I: Integer range := 1; begin loop Put_Line(Integer'Image(I)); I := I * 10; end loop; end;