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ó:- a generációs információk eredetét a hiba helyzet, amelyet helyben nem megoldható;
- 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:- megállítani végrehajtó;
- visszatérési értéke jelzi, hogy „hiba”;
- 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:- N ugyanolyan típusú, mint az E;
- H egyedülállóan rendelkezésre nyilvános alap osztály E;
- H és E mutatók, és 1 vagy 2 kerül végrehajtásra a típusokat, amelyekre vonatkoznak;
- 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.- Visszatérés az objektumot a „rossz” állapotban, és azon a tényen alapul, hogy a felhasználó ellenőrizze az állapotát.
- É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.
- 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.
- 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)
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