Sdílet prostřednictvím


Rozdíly zpracování výjimek

Hlavní rozdíl mezi structured exception handling a zpracování výjimek v jazyce C++ je, že zpracování modelu obchodů v typech C++ výjimku při c structured exception model zpracování zabývá výjimky jeden typ – konkrétně unsigned int.C výjimky jsou označeny hodnotou číslo bez znaménka že C++ výjimky jsou identifikovány pomocí datového typu.Při c je vyvolána výjimka, provede každý možný popisovač filtru, který prověří kontext c výjimky a určuje, zda přijmout výjimku, předat jiné obsluze nebo ji ignorovat.V jazyce C++ je výjimka, může být libovolného typu.

Druhý rozdíl je, že model c structured exception handling je uvedené "asynchronní", dojít k Normální tok řízení sekundární výjimky.Zpracování mechanismus C++ výjimek je plně "synchronní," což znamená, že výjimky dochází pouze při jejich vyvolaných.

Pokud je v programu C++ C výjimka, ji lze zpracovat structured exception Handler s jeho přidružený filtr nebo C++ úlovku zpracování, podle toho je dynamicky blíže kontextu výjimku.Například následující program C++ vyvolává c výjimka uvnitř C++ akci kontextu:

Příklad

// exceptions_Exception_Handling_Differences.cpp
// compile with: /EHa
#include <iostream>

using namespace std;
void SEHFunc( void );

int main() {
   try {
      SEHFunc();
   }
   catch( ... ) {
      cout << "Caught a C exception."<< endl;
   }
}

void SEHFunc() {
   __try {
      int x, y = 0;
      x = 5 / y;
   }
   __finally {
      cout << "In finally." << endl;
   }
}
  
  

Například následující kód instaluje vlastní překladatelské funkce a pak vyvolává c výjimek, který je zabalen v SE_Exception třídy:

// exceptions_Exception_Handling_Differences3.cpp
// compile with: /EHa
#include <stdio.h>
#include <eh.h>
#include <windows.h>

class SE_Exception {
private:
   SE_Exception() {}
   unsigned int nSE;

public:
   SE_Exception( SE_Exception& e) : nSE(e.nSE) {}
   SE_Exception(unsigned int n) : nSE(n) {}
   ~SE_Exception() {}
   unsigned int getSeNumber() { return nSE; }
};

void SEFunc() {
   __try {
      int x, y = 0;
      x = 5 / y;
    }
    __finally {
      printf_s( "In finally\n" );
   }
}

void trans_func( unsigned int u, _EXCEPTION_POINTERS* pExp ) {
   printf_s( "In trans_func.\n" );
   throw SE_Exception( u );
}

int main() {
   _set_se_translator( trans_func );
    try {
      SEFunc();
    }
    catch( SE_Exception e ) {
      printf_s( "Caught a __try exception with SE_Exception.\n" );
      printf_s( "nSE = 0x%x\n", e.getSeNumber() );
    }
}
  
  
  

C třída výjimek souhrnného seznamu stop

Jednoduchý příklad, stejně jako výše, C výjimka může být zachycen pouze tři tečky (...) úlovku popisovač.Obslužná rutina je sdělena žádné informace o druhu nebo povahy výjimku.Zatímco tato metoda funguje, v některých případech budete muset definovat transformace mezi dvěma zpracování výjimek modely tak, aby každý c výjimka spojena s konkrétní třídy.Chcete-li to provést, můžete definovat "obálky" Třída C výjimky, které mohou být použity nebo odvozen z atributu typu konkrétní třídy c výjimky.Tímto způsobem může být každý c výjimka zpracována C++ úlovku popisovač samostatně než v předchozím příkladu.

Souhrnnou třídu pravděpodobně rozhraní skládající se z některé funkce členů, která určují hodnotu výjimky a který přístupu rozšířené výjimku kontextové informace poskytnuté c výjimku modelu.Můžete také definovat výchozí konstruktor a konstruktor, který přijímá unsigned int argument (poskytnout pro znázornění podkladového c výjimka) a konstruktor bitové kopie.Je možné provedení třídy c výjimka souhrnného seznamu stop:

// exceptions_Exception_Handling_Differences2.cpp
// compile with: /c
class SE_Exception {
private:
   SE_Exception() {}
   SE_Exception( SE_Exception& ) {}
   unsigned int nSE;
public:
   SE_Exception( unsigned int n ) : nSE( n ) {}
   ~SE_Exception() {}
   unsigned int getSeNumber() {
      return nSE;
   }
};

Pomocí této třídy je nainstalovat vlastní c výjimka překladu funkci, která se nazývá výjimečně interní mechanismus c výjimka při každém zpracování.V rámci své funkce překladu lze vyvolat všechny zadané výjimky (možná SE_Exception typ nebo typ třídy odvozené z SE_Exception), může být zachycena vhodné odpovídající C++ úlovku popisovač.Funkce překladu můžete jednoduše vrátit, což znamená, že jej nepodařilo zpracovat výjimku.Pokud samotné funkce překladu vyvolává c výjimka Ukončit se nazývá.

Chcete-li určit vlastní překladatelské funkce volání _set_se_translator s názvem překlad funkce jako její jediný argument funkce.Převodní funkce, která píšete je vyvolána jedenkrát pro každou vyvolání funkce v zásobníku, který má akci bloky.Není žádná výchozí funkce překladu; Pokud nezadáte jedním voláním _set_se_translator, C výjimka může být zachycen pouze tři tečky úlovku popisovač.

Viz také

Referenční dokumentace

Míchání (strukturované) C a C++ výjimky