_set_se_translator
Úchyty Win32 výjimky (C strukturované výjimky) jako C++ zadané výjimky.
_se_translator_function _set_se_translator(
_se_translator_function seTransFunction
);
Parametry
- seTransFunction
Ukazatel C strukturované výjimky překladač funkce, která píšete.
Vrácená hodnota
Vrací ukazatel na předchozí funkce překladače registrovány _set_se_translator, takže může být později obnovena předchozí funkce.Pokud byla nastavena žádná předchozí funkce, vrácenou hodnotu lze obnovit výchozí chování; Tato hodnota může být NULL.
Poznámky
_set_se_translator Funkce poskytuje způsob, jak zpracovávat výjimky Win32 (C strukturované výjimky) jako C++ zadané výjimky.Chcete-li povolit jednotlivé výjimky C ke zpracování pomocí C++ catch obslužnou rutinu, nejprve definovat C obálkovou třídu výjimek, které lze použít nebo atribut typ konkrétní třídy C výjimky odvozené z,.K použití této třídy, nainstalujte vlastní funkci C výjimku překladatel, která se nazývá vnitřní mechanismus zpracování výjimek pokaždé, když je vyvolána výjimka C.V rámci své funkce překladač lze vyvolat typových výjimek, která může být zachycena odpovídající C++ catch obslužnou rutinu.
Je nutné použít /EHa při použití _set_se_translator.
Chcete-li určit vlastní překladatelské funkce, volání _set_se_translator s názvem funkce překladu jako svůj argument.Napíšete funkci překladač je volána jednou pro každý vyvolání funkce v zásobníku, který má try bloky.Neexistuje žádný výchozí překladač funkce.
Funkce překladač dělat více než C++ vyvolat zadané výjimky.Pokud ano, nic kromě vyvolání (jako je například zápis do souboru protokolu) váš program nemusí chovat dle očekávání, protože kolikrát je vyvolána funkce překladač je závislá na platformě.
V prostředí s více podprocesy překladač funkce udržovány odděleně pro každý podproces.Každé nové vlákno, je třeba nainstalovat vlastní překladač funkce.Každé vlákno je tedy pro vlastní zpracování překladu._set_se_translator je specifický pro jedno vlákno; jiné knihovně DLL, můžete nainstalovat různé převodní funkce.
seTransFunction Funkce, která píšete, musí být zkompilován nativní funkce (není kompilována s/CLR).Je třeba provést celé číslo bez znaménka a ukazatel Win32 _EXCEPTION_POINTERS strukturu jako argumenty.Argumenty jsou vrácené hodnoty volání rozhraní API Win32 GetExceptionCode a GetExceptionInformation funkce v tomto pořadí.
typedef void (*_se_translator_function)(unsigned int, struct _EXCEPTION_POINTERS* );
Pro _set_se_translator, jsou důsledky při dynamické propojení CRT; můžete volat jiné knihovně DLL v procesu _set_se_translator a nahradit vaši obslužnou rutinu vlastní.
Při použití _set_se_translator ze spravovaného kódu (kód zkompilován s/CLR) nebo smíšené nativní a spravované kód, uvědomte si, že překladač ovlivní výjimky generované v nativním kódu pouze.Některé spravované výjimky generované ve spravovaném kódu (např. při zvýšení System::Exception) nejsou směrovány pomocí funkce překladače.Výjimky vyvolané do spravovaného kódu pomocí funkce Win32 RaiseException nebo systémové výjimky, jako je dělení podle nula výjimka jsou směrovány přes překladač.
Požadavky
Rutina |
Požadované záhlaví |
---|---|
_set_se_translator |
<EH.h> |
Funkce poskytované _set_se_translator není k dispozici v kódu zkompilovaného s /clr: pure možnost kompilátoru.
Další informace o kompatibilitě naleznete v úvodu tématu Kompatibilita.
Příklad
// crt_settrans.cpp
// compile with: /EHa
#include <stdio.h>
#include <windows.h>
#include <eh.h>
void SEFunc();
void trans_func( unsigned int, EXCEPTION_POINTERS* );
class SE_Exception
{
private:
unsigned int nSE;
public:
SE_Exception() {}
SE_Exception( unsigned int n ) : nSE( n ) {}
~SE_Exception() {}
unsigned int getSeNumber() { return nSE; }
};
int main( void )
{
try
{
_set_se_translator( trans_func );
SEFunc();
}
catch( SE_Exception e )
{
printf( "Caught a __try exception with SE_Exception.\n" );
}
}
void SEFunc()
{
__try
{
int x, y=0;
x = 5 / y;
}
__finally
{
printf( "In finally\n" );
}
}
void trans_func( unsigned int u, EXCEPTION_POINTERS* pExp )
{
printf( "In trans_func.\n" );
throw SE_Exception();
}
Přestože funkce poskytované _set_se_translator je ve spravovaném kódu není k dispozici, je možné použít mapování v nativním kódu i v případě, že nativního kódu je kompilace pod /clr přepnout, nativní kód je uveden pomocí #pragma unmanaged.Strukturované je výjimka ve spravovaném kódu, který má být namapován, musí být kód, který vytváří a zpracovává výjimky označeno pragma.Následující kód ukazuje možné použití.Další informace naleznete v tématu Direktivy Pragma a klíčové slovo __Pragma.
// crt_set_se_translator_clr.cpp
// compile with: /clr
#include <windows.h>
#include <eh.h>
#include <assert.h>
#include <stdio.h>
int thrower_func(int i) {
int j = i/0;
return 0;
}
class CMyException{
};
#pragma unmanaged
void my_trans_func(unsigned int u, PEXCEPTION_POINTERS pExp )
{
printf("Translating the structured exception to a C++"
" exception.\n");
throw CMyException();
}
void DoTest()
{
try
{
thrower_func(10);
}
catch(CMyException e)
{
printf("Caught CMyException.\n");
}
catch(...)
{
printf("Caught unexpected SEH exception.\n");
}
}
#pragma managed
int main(int argc, char** argv) {
_set_se_translator(my_trans_func);
DoTest();
return 0;
}
Ekvivalent v rozhraní .NET Framework
Nelze použít. Pokud chcete volat standardní funkci jazyka C, použijte PInvoke. Další informace naleznete v tématu Příklady vyvolání platformy.