kivétel kezelése

Előadás 14. Kivétel kezelése

Amikor a program van kialakítva külön modulokat, és különösen akkor, ha ezek a modulok önállóan kifejlesztett könyvtárak, hibakezelés kell két részre osztható:
  1. a generációs információk eredetét a hiba helyzet, amelyet helyben nem megoldható;
  2. hibakezelés megtalálható más helyeken.

Az alapgondolat az, hogy a funkció érzékeli a problémát, de nem tudta, hogyan oldja meg, kivételt dob, abban a reményben, hogy ez okozta (közvetve vagy közvetlenül) a szolgáltatás nem oldja meg a problémát. Funkció, amely azt akarja, hogy megoldja a problémákat, az ilyen típusú, jelezhetik, hogy felfogja az ilyen kivételek.

Ez a stílus a hibakezelés előnyös számos hagyományos technikákat. Tekintsük az alternatíva. Ha probléma merül fel, hogy nem lehet megoldani a helyben, a funkció lehet:
  1. megállítani végrehajtó;
  2. visszatérési értéke jelzi, hogy „hiba”;
  3. vissza érvényes értéket, és hagyja a program egy abnormális állapot.

1. lehetőség - „leállnak” - ez az, ami történik alapértelmezés, ha nem elkapni kivételek. A legtöbb hiba, meg kell jön valami jobb. Könyvtár biztosan befejezi a végrehajtás nem lehet használni a programban, az első követelmény, hogy - a megbízhatóság.

2. lehetőség - „visszatérési értéke, jelző- hiba” - nem mindig valósítható meg, mert gyakran nincs elfogadható szinten. Még azokban az esetekben, ahol ez a megközelítés alkalmazható, gyakran kellemetlen, mert az eredmény minden egyes hívás után ellenőrizni kell hibaértéket. Ez nagyban növeli a méretét a program.

3. lehetőség - „vissza érvényes értéket, és hagyja a program egy abnormális állapot” - az a hátránya, hogy a hívó fél nem veszi észre, hogy a program egy abnormális állapot.

kivételkezelés mechanizmus alternatívát nyújt a hagyományos módszerek, amennyiben ezek nem elegendőek, nem elegáns, és a hibalehetőség. Ez egy módja annak, hogy kifejezetten elválasztó hibakezelés kódot a „rendes” kód, így a program érthetőbbé és jobban megfelelnek a különböző eszközöket. kivételkezelés mechanizmust biztosít egy szabályos módon kezelési hibák, ami megkönnyíti a kölcsönhatás eredményeként az egyes írásbeli kódrészletek.

Meg kell érteni, hogy a hibakezelés is kihívást jelent, és kivételkezelés mechanizmus - annak ellenére, hogy a bóformalizációs nagyobb, mint az alternatív módszerek - viszonylag kevésbé, mint a strukturált nyelvi források biztosítása a helyi végrehajtás irányítását. C ++ kivételkezelés mechanizmus lehetővé teszi a programozó hibát feldolgozó eszköz azon a helyen, ahol a legnagyobb természetes módon feldolgozott a rendszer szerkezetét. Kivételek hogy összetettsége kezelési hibák jobban látható. Azonban kivételek nem az oka ennek a komplexitás.

kivételkezeléssel mechanizmus lehet tekinteni alternatívájaként a mechanizmus a visszatérés a funkciót. Ezért teljesen jogos a kivételek, amelyek nem kapcsolódnak a hibákra. Azonban az elsődleges célja a kivétel kezelése a hibakezelés és a fenntarthatóság hiba esetén.

Kivétel Processing eljárást biztosít vezérlő információ továbbítására és határozatlan pont, ahol ez a kifejezte azon óhaját, hogy kezelni ezt a fajta helyzetet. Helyzetek bármilyen típusú lehet gerjeszteni (dobás) és a tengelymetszet (fogás), és a funkciót átvihetők több helyzetek lehet gerjeszteni ott.

A reakció csak akkor váltja ki a végrehajtás esetén egy izgatott kifejezést a készülék belsejében, az ellenőrző és nevezett funkció ebben a blokkban.

blokk szintaxis szabályozás:
megpróbál<список реакций>

Expression gerjesztés szintaxisa a következő:
dob<выражение> ;

Gerjesztés hatására helyzet (azaz a dobás üzemeltető teljesítő) vezérlés átkerül a reakciót. Típus dobás operátor operandus meghatározza, hogy mely reakciók felderíteni ezt a helyzetet.

Ha között a reakciók a vezérlőegység találtuk megfelelő reakció lista alkalmas reakció a vezérlőegység, amely lefedi a blokk a kontroll.

Ha a program már nem talált megfelelő reakció okozott megszüntetheti () függvény. megszűnését () függvény meghívja a függvényt által meghatározott végül elérni a set_terminate () függvényt. Alapértelmezésben a funkció kerül meghívásra a megszüntetésére () függvényt. van abort (). Funkció, a funkció megszünteti (). kell befejezni a programot.

Kivételt képez ez alól az objektum egy bizonyos osztály. Ez arra utal, hogy kivételes esetben. A kódot észlelt a hiba, akkor létrehoz egy objektumot dobás utasításokat. A kódrészlet kifejezi vágyát, hogy kezelni, kivéve egy fogás nyilatkozatot. Az eredmény egy kivétel a dobás nyilatkozatot a kikapcsolódáshoz a verem, amíg nem megfelelő fogást a funkció megtalálható, amely közvetlenül vagy közvetve okozott a funkciót, kivételt dob.

Az a tény, kizárási generációs információkat küld a hiba és annak típusát. Ezen túlmenően, a kivétel további információkat tartalmaznak. Az alapvető cél a kivételkezelés technika információt továbbítani, hogy felépüljön előfordulását problémák és ehhez egy megbízható és kényelmes módon.

A felvezető lehet hivatkozni, ha:
  1. N ugyanolyan típusú, mint az E;
  2. H egyedülállóan rendelkezésre nyilvános alap osztály E;
  3. H és E mutatók, és 1 vagy 2 kerül végrehajtásra a típusokat, amelyekre vonatkoznak;
  4. H egy referencia, és 1 vagy 2 kerül végrehajtásra a típusú hivatkozott h.

Gyakran kivételek természetesen a család. Ebből az következik, hogy az öröklődés hasznos lehet strukturálni kivételek és segíteni a kezelést. Például kivételeket matematikai könyvtár lehet megszervezni a következők szerint.

osztály mathErr <.>; osztály túlcsordulás. nyilvános mathErr <.>; osztály Alulcsordulás. nyilvános mathErr <.>; osztály ZeroDivision. nyilvános mathErr <.>;

// // túlfolyó túlfolyó felülről alulról // Division 0

Ez lehetővé teszi számunkra, hogy kezelni, kizárva minden osztály származó MathErr. nem törődve, hogy pontosan mit kivétel történt.

// Handle kivétel túlcsordulás és az összes ebből származó Kivétel // kezelni bármilyen kivétel MathErr. nem túlcsordulás

Szervezése kivételek formájában hierarchia fontos lehet a megbízhatóságát a kódot. A bevezetett új kivétel a matematikai könyvtárban minden darab kódot, amely megpróbálja kezelni az összes matematikai kivétel lenne olyan változtatással. Ez megköveteli a sok munka, és általában lehetetlen.

Ragályos kivételkezelőt dönthet úgy, hogy nem tudja teljes mértékben kezelni a hibát. Ebben az esetben a felvezető teszi, amit lehet majd ismét kivételt állít elő.

// Lehet teljesen kezelni a hibát? // Tedd, amit lehet // Re-generáció kivételek

újrageneráljuk tényt a távollétében operandus dobás. Ha a kísérlet újbóli generációs kivétel nélkül, a funkció megszűnését () nevezzük.

Ismételten generált kivétel egy kivétel forrás, azaz a akkor is, ha a felvezető működik azzal a céllal, az alap osztály. kiterjedő egység először fogadja a létrehozott objektum egy származtatott osztály.

Mivel kivételek származtatott osztályokban lehet elfogott kivételkezelőt alap osztály, rend, amelyben a rögzített utasításokat rakodók kipróbálni. Ez nagyon fontos. Rakodók ellenőrzik abban a sorrendben kerültek rögzítésre.

megpróbál catch (std :: ios_base :: hiba) catch (std :: kivétel) catch (.)

// hiba kezelése az I / O-patak // Kivételkezelés a standard könyvtár // kezelni az összes többi kivételtől

Kivételek biztosítani oly módon, hogy megoldja a problémát, hogy hogyan jelentse be a hibát a tervezők. Mivel a kivitelező nem ad vissza értéket, hogy a hívó fél ellenőrizze, hagyományos (azaz használata nélkül kivételkezelés) alternatívák a következők.
  1. Visszatérés az objektumot a „rossz” állapotban, és azon a tényen alapul, hogy a felhasználó ellenőrizze az állapotát.
  2. Értéket rendelni egy nem helyi változót, hogy a sikertelen létrehozása egy tárgy, és hivatkozhat arra a tényre, hogy a felhasználó ellenőrizze.
  3. Ne végezzen semmilyen inicializálás a kivitelező, és hivatkozhat arra a tényre, hogy a felhasználó fogja hívni az inicializálási funkció (még meg kell írni!) Az első használat előtt az objektum.
  4. Mark mint egy inicializálatlan objektumot, és az első hívást egy tag függvény osztály erre az épületre végre az inicializálás (ez a funkció egy hibaüzenet jelenik meg abban az esetben, sikertelen indítása, de a felhasználónak kell újra ellenőrizni a visszatérési érték a funkció).

Kivételek teszi az információ átadása a sikertelen indítása és a tervezők. Például a Vector osztály lehetne védeni kérés túl sok memóriát, így egy megfelelő kivétel. osztály vektor <. public. class Size <.>; Vektor (int n = 0); .>; Vektor :: Vector (int n) MAX_SIZE) dobás Méret (); .>

A kód létrehoz egy vektor, most észreveszi a hibát Vector :: Size, és próbálja meg valami értelmes.

Ha a kivételt várható, és fogott egy utat, amely nem befolyásolja hátrányosan a viselkedését a program, akkor miért lehet tekinteni a hiba? kivételkezelés mechanizmusokat lehet tekinteni, mint egy másik ellenőrzési struktúrát.

// Az függvény kivételt állít üres. ha a várólista üres

Kivételkezelés kevésbé strukturált mechanizmus, mint a helyi ellenőrzési struktúrák azonos kivételkezelés gyakran kevésbé hatékony, ha a kivétel ténylegesen keletkezett. kizárás ezért arra kell használni azokban az esetekben, ahol a hagyományos ellenőrzési struktúrák nem elegáns megoldás, vagy nem tudják használni.

Túlzott használata kivételek vezet érthetetlen kódot. Normális esetben be kell tartania szempontjából „kivétel kezelése hibakezelés.” Ezzel a megközelítéssel, a kód érthető módon oszlik két részből áll: egy közönséges kódot, és hiba-kezelő kód.

Azt feltételezik, hogy egy függvény bejelentett kivétel nélkül specifikáció lehet dobni kivételt.
int g (int n);

A függvény generál kivétel nélkül meg lehessen állapítani egy üres lista kivételek előírásoknak.
int h (int n) dobja ();

Mi módosítsa a Stack osztály (az előadás 11), úgyhogy amikor a verem túlcsordulás és kísérletet tesz egy elemet egy üres verem generálni a megfelelő kivétel.
#include osztály Stack; osztály StackEmpty Stack * GetPtr () >; osztály StackFull Stack * GetPtr () int getValue () >; osztály Stack ; int verem [SIZE]; int * korcs; nyilvánosság számára. Stack ()

Kapcsolódó cikkek