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č.