Sdílet prostřednictvím


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

Viz také

Referenční dokumentace

Rutiny zpracování výjimek

set_terminate (CRT)

set_unexpected (CRT)

terminate (CRT)

neočekávané (CRT)