Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Microsoft-specifikus
Az try-except utasítás a Microsoft C nyelvre vonatkozó bővítménye, amely lehetővé teszi, hogy az alkalmazások átvegyék az irányítást egy program felett, amikor a végrehajtást általában leállító események történnek. Az ilyen eseményeket kivételeknek nevezzük, a kivételekkel foglalkozó mechanizmust pedig strukturált kivételkezelésnek nevezzük.
A kivételek lehetnek hardver- vagy szoftveralapúak. Még akkor is, ha az alkalmazások nem képesek teljesen helyreállítani a hardver- vagy szoftverkivételeket, a strukturált kivételkezelés lehetővé teszi a hibainformációk naplózását és megjelenítését. Hasznos, ha az alkalmazás belső állapotát csapdába ejti a probléma diagnosztizálásához. Különösen hasznos olyan időszakos problémák esetén, amelyeket nem könnyű reprodukálni.
Szemantika
try-except-statement:
__trycompound-statement__except (expression)compound-statement
A záradék utáni __try összetett utasítás a védett szakasz. A záradék utáni __except összetett utasítás a kivételkezelő. A kezelő megadja a végrehajtandó műveleteket, ha a védett szakasz végrehajtása során kivétel lép fel. A végrehajtás a következőképpen folytatódik:
A védett szakasz végrehajtása történik.
Ha a védett szakasz végrehajtása során nem történik kivétel, a végrehajtás a záradék utáni
__exceptutasításban folytatódik.Ha kivétel történik az őrzött szakasz végrehajtása során, vagy bármilyen rutinban a védett szakaszhívások során, a
__exceptkifejezés kiértékelésre kerül. A visszaadott érték határozza meg a kivétel kezelését. Három lehetséges érték létezik:EXCEPTION_CONTINUE_SEARCH: A kivétel nem ismerhető fel. Folytassa a verem keresését egy kezelőre, először az utasításokratry-except, majd a következő legmagasabb prioritású kezelőkre.EXCEPTION_CONTINUE_EXECUTION: A kivétel felismerve, de elutasítva. Folytassa a végrehajtást azon a ponton, ahol a kivétel történt.EXCEPTION_EXECUTE_HANDLERA kivétel felismerve van. Az összetett utasítás végrehajtásával vigye át a vezérlőt a__exceptkivételkezelőbe, majd folytassa a végrehajtást a kivétel bekövetkeztének időpontjában.
Mivel a __except kifejezés C kifejezésként van kiértékelve, egyetlen értékre, a feltételes kifejezés operátorra vagy a vessző operátorra korlátozódik. Ha szélesebb körű feldolgozásra van szükség, a kifejezés meghívhat egy rutint, amely a fent felsorolt három érték egyikét adja vissza.
Megjegyzés:
A strukturált kivételkezelés C és C++ forrásfájlokkal működik. Azonban nem kifejezetten C++-ra tervezték. Hordozható C++ programok esetén a C++ kivételkezelést kell használni a strukturált kivételkezelés helyett. Emellett a C++ kivételkezelési mechanizmus sokkal rugalmasabb, mivel bármilyen típusú kivételt képes kezelni. További információ: Kivételkezelés a C++ nyelvi referenciában.
Az alkalmazások minden rutinja saját kivételkezelőt tartalmazhat. A __except kifejezés a törzs hatókörében __try fut. Hozzáféréssel rendelkezik az ott deklarált helyi változókhoz.
A __leave kulcsszó érvényes egy try-except utasításblokkon belül. A hatás __leave az, hogy ugrik a végére a try-except blokk. A végrehajtás a kivételkezelő befejezése után folytatódik. Bár egy goto utasítás használható ugyanahhoz az eredményhez, az goto utasítás a verem kikapcsolását okozza. Az __leave utasítás hatékonyabb, mert nem jár a verem visszatekerésével.
try-except A futásidejű függvényt használó longjmp utasításból való kilépés rendellenes leállásnak minősül. Nem legális belevágni egy __try nyilatkozatba, de legális kiugrni belőle. A kivételkezelő nem lesz meghívva, ha egy folyamat egy utasítás végrehajtása try-except közben le van ölték.
példa
Íme egy példa egy kivételkezelőre és egy megszüntetési kezelőre. A megszüntetési kezelőkkel kapcsolatos további információkért lásd a try-finally C utasítást.
.
.
.
puts("hello");
__try {
puts("in try");
__try {
puts("in try");
RAISE_AN_EXCEPTION();
} __finally {
puts("in finally");
}
} __except( puts("in filter"), EXCEPTION_EXECUTE_HANDLER ) {
puts("in except");
}
puts("world");
A példa kimenete a jobb oldalon található megjegyzéssel:
hello
in try /* fall into try */
in try /* fall into nested try */
in filter /* execute filter; returns 1 so accept */
in finally /* unwind nested finally */
in except /* transfer control to selected handler */
world /* flow out of handler */
END Microsoft-specifikus