Megosztás a következőn keresztül:


try-except utasítás (C)

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:
__try compound-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:

  1. A védett szakasz végrehajtása történik.

  2. 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 __except utasításban folytatódik.

  3. 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 __except kifejezé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ásokra try-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_HANDLER A kivétel felismerve van. Az összetett utasítás végrehajtásával vigye át a vezérlőt a __except kivé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

Lásd még

try-except utasítás (C++)