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.

Hasonló dokumentumok
Programozási nyelvek (ADA)

2. előadás Programegység, fordítási egység, könyvtári egység, beágyazás, blokkszerkezet, alprogramok, csomagok

Pénzügyi algoritmusok

Programozási nyelvek Java

Változók élettartama

8. előadás Dinamikus memóriakezelés. Mutatók. Láncolt adatszerkezetek.

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

11) Statikus és dinamikus hatóköri szabályok. Statikus és dinamikus hatókör. értelmezzük

Programozás II. 2. Dr. Iványi Péter

5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

Java programozási nyelv 9. rész Kivételkezelés

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

Alprogramok, paraméterátadás

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Programozási nyelvek (ADA)

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Kivételkezelés a C++ nyelvben Bevezetés

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.

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

Programozási nyelvek I. (Az Ada) Kozsik Tamás

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

1. Alapok. Programozás II

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

Csomag. Adatbázis-objektum Programozási eszközök gyűjteménye Két részből áll. specifikáció törzs (opcionális)

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Imperatív programozás

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Programozás C és C++ -ban

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Tételsor a Programozási nyelvek (Ada) tárgyhoz 1-10

Haladó DBMS ismeretek 1

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Függvények. Dr. Bécsi Tamás 6. Előadás

Kivételek, kivételkezelés a C++ nyelvben

C programozási nyelv

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

3. Osztályok II. Programozás II

Programozás II. 4. Dr. Iványi Péter

Objektumorientált programozás C# nyelven

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 jelzése

Algoritmizálás és adatmodellezés tanítása 1. előadás

Oktatási segédlet 2014

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Bevezetés a programozásba I.

5. Gyakorlat. struct diak {

Algoritmizálás + kódolás C++ nyelven és Pascalban

Programozás alapjai. 5. előadás

Gregorics Tibor Modularizált programok C++ nyelvi elemei 1

Bevezetés a programozásba. 8. Előadás: Függvények 2.

JAVA PROGRAMOZÁS 2.ELŐADÁS

Kifejezések. Kozsik Tamás. December 11, 2016

A C programozási nyelv IV. Deklaráció és definíció

Alkalmazott Modul III 3. előadás. Procedurális programozás: alprogramok, kivételkezelés

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

B IT MAN 65/1. Adatbázis Rendszerek II. Ellenőrző kérdések APLSQL B IT MAN. v:

Maximum kiválasztás tömbben

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

Programozási nyelvek Java

A C programozási nyelv II. Utasítások. A függvény.

Programozás C++ -ban

Tranzakciókezelés PL/SQL-ben

Java programozási nyelv 4. rész Osztályok II.

Informatika terméktervezőknek

Alkalmazott Modul III 3. előadás. Procedurális programozás: alprogramok, kivételkezelés. Alprogramok Szükségessége

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Globális operátor overloading

1. Bevezetés A C++ nem objektumorientált újdonságai 3

1. Bevezetés szeptember 9. BME Fizika Intézet. Szám. szim. labor ea. Tőke Csaba. Tudnivalók. feladat. Tematika. Moodle Házi feladatok

Programozás I. 5. Előadás: Függvények

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Web-technológia PHP-vel

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Java programozási nyelv 5. rész Osztályok III.

PL/SQL blokk. [címke] [DECLARE deklarációs utasítás(ok)] BEGIN végrehajtható utasítás(ok) [EXCEPTION kivételkezelő] END [név];

Programozás alapjai. 10. előadás

Gregorics Tibor Tanácsok modularizált programok készítéséhez 1

Java II. I A Java programozási nyelv alapelemei

Mérnöki programozás 7. Szerkesztette: dr. Vass Péter Tamás

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

Összefoglaló. <variable_name> [IN OUT IN OUT] <data_type> [:=<default_value>] ... <label_name>: <statements>... GOTO <label_name>;...

C++ programok fordítása

tétel: különböző típusú adatokat csoportosít, ezeket egyetlen adatként kezeli, de hozzáférhetünk az elemeihez is

Java II. I A Java programozási nyelv alapelemei

10. előadás Párhuzamos programozási kérdések. Az Ada taszkok (1).

ISA szimulátor objektum-orientált modell (C++)

2019, Funkcionális programozás. 2. el adás. MÁRTON Gyöngyvér

Java IX. telkezelés a Java-ban

és az instanceof operátor

Átírás:

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.

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

Definíció Egy programentitás megadása, egy új entitás bevezetése Változó, típus, programegység (alprogram, csomag, osztály stb.) 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 3

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

Változódeklaráció int x; X: Integer; A változóhoz az x/x nevet rendeli 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 5

Típusdefiníció és típusdeklaráció A típusdefiníció új típust vezet be type Int is new Integer; Tömb: array (1..0) of Float; A típusdeklaráció egy nevet vezet be egy típushoz typedef int integer; // szinoníma Név szerinti vs. szerkezeti típusekvivalencia 6

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

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

Deklaráció definíció nélkül (1) 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. 9

Hasonló a C/C++ nyelvekben #ifndef PROBA_H #include "proba.h" #define PROBA_H int 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); } 10

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

Deklaráció definíció nélkül (3) 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 function Gcd ( A, B: Positive ) return Positive renames Lnko; AI: Float renames A(I); AI := AI + 1; 12

Definíció deklaráció nélkül Ha nem adunk nevet a létrehozott entitásnak funkcionális nyelvek: lambda-függvények Java: névtelen osztályok 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; 13

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

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

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

Kiterjesztett láthatóság procedure A is X: Integer := 1; begin declare X: Integer := 2; begin Put(X); Put(A.X); end; 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 17

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

Beágyazás Programegységet egy blokk deklarációs részébe 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; end; 19

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

Blokkok és hatókör Egy blokk deklarációinak hatóköre a deklarációtól a blokk végéig tart 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; end; 21

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

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

Lokális és nonlokális deklaráció Egy blokkban elhelyezett deklaráció lokális (local) a blokkra nézve A blokkon kívülről nem hivatkozható 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; 24

Globális deklaráció Eddig: lokális / nonlokális (globális) egy deklaráció egy blokkra nézve relatív 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; } 25

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

Statikus és dinamikus hatókör A programozási nyelvek többségében: statikus 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; 27

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

Hatókör és élettartam 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 Nem mindig így van Dinamikusan lefoglalt változók C/C++ static változók, Java zárványok (inner) 29

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

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

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

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

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

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

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

Egy program a memóriában 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) 37

Dinamikus változók Dinamikus tárterület Ahonnan a programozó allokátorral tud memóriát foglalni Explicit felszabadítás vagy szemétgyűjtés Mutatók és referenciák 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 38

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

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

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

Kivételek A végrehajtási verem kiürítése stack trace Vezérlésátadás kivételes esetek kezelésénél 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 Kiváltódás, terjedés, lekezelés, definiálás, kiváltás 42

Nyelvi eszköz kivételkezelésre 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 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 43

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

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

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

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

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

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

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

Kivételek terjedése és a blokkok 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 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 51

Kivételek kezelése C++ esetén: try-catch összetett utasítás 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 52

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

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

Kivételkezelő ágak 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; 55

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

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

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

Ha egy blokkban kivétel keletkezik Az utasítások végrehajtása közben: A blokkban lekezelhetjük egy kivételkezelő részben (a blokkban lép fel ) 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 ) 59

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

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

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 62

Ha nem tudok elvégezni egy műveletet (2) generic type Element is private; csak megjegyzés 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 (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 64

Mire használom a kivételeket? Kivételes eset jelzésére Előfeltétel nem teljesült Valami elromlott menet közben (pl. hálózati kapcsolat megszakadt) 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) 65

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

Kivétel lecserélése Szétválasztás 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; ha üres end Stacks; 67

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

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

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)" );... 70

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 "<" ( A, B: Elem ) return Boolean is <>; Üres_Tömb: Exception_Id := Constraint_Error ' Identity; function Max ( T: Tömb ) return Elem; 71

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 72

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

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