Freigeben über


_set_se_translator

Handle-Win32-Ausnahmen (C++) als Ausnahmen C-strukturierte angegebenen Ausnahmen.

_se_translator_function _set_se_translator(
   _se_translator_function seTransFunction
);

Parameter

  • seTransFunction
    Zeiger auf die Übersetzung für Reservierungen Wechselstrom-strukturierter Ausnahme, die Sie schreiben.

Rückgabewert

Gibt einen Zeiger auf die vorherige Funktion Übersetzung zurück, die von _set_se_translatorregistriert ist, sodass die vorherige Funktion später wiederhergestellt werden kann.Wenn keine vorherige Funktion festgelegt wurde, kann der Rückgabewert verwendet werden, um das Standardverhalten wiederherzustellen. dieser Wert kann NULL sein.

Hinweise

Die _set_se_translator-Funktion bietet eine Möglichkeit zum C-strukturierte Win32-Ausnahmen (C++) als Ausnahmen behandeln Ausnahmen übermittelt hat.Um der Handler Ein C++-Compiler catch behandelt werden soll C-Ausnahme zu ermöglichen, definieren Sie zunächst Wechselstrom-Ausnahme einer Wrapperklasse für die verwendet werden kann, oder abgeleitet von dem Attribut ein bestimmter Klassentyp Wechselstrom-Ausnahme.Um diese Klasse zu verwenden, installieren Sie eine benutzerdefinierte C-Ausnahme übersetzer die Funktion von der internen Wechselstrom-Ausnahme des Mechanismus für die Ausnahmenbehandlung jedes Mal ausgelöst wird.Innerhalb der Übersetzung für Reservierungen können Sie jede typisierte Ausnahme auslösen, die von einem entsprechenden Handler C++ catch abgefangen werden kann.

Sie müssen /EHa verwenden, wenn Sie _set_se_translatorverwenden.

So fügen Sie eine benutzerdefinierte Funktion Übersetzungs, rufen Sie _set_se_translatormit dem Namen der Übersetzungs Funktion als Argument angeben.Die Übersetzung für Reservierungen, die Sie schreiben, wird einmal für jeden Aufruf der Funktion im Stapel aufgerufen, der tryBlöcke verfügt.Es gibt keine standardmäßigen Übersetzung für Reservierungen.

Die Übersetzung ausführen als Funktion sollte nicht mehr im C-Format C++-Compiler typisierter Ausnahme auslösen.Wenn Sie alle zusätzlich zum Auslösen der Fall ist (z. B. das Schreiben in eine Protokolldatei), z. B. verhielte das Programm möglicherweise nicht wie erwartet, da für die Frequenz, die die Funktion aufgerufen wird, plattformabhängig Übersetzung ist.

In einer Multithreadumgebung sind Übersetzung für jeden Thread einzeln Funktionen beibehalten.Jeder neue Thread muss über eine eigene Übersetzung für Reservierungen vornehmen.Daher ist jeder Thread verantwortlich für die eigene Übersetzungs Klassenbehandlung._set_se_translatorentspricht einem Thread bestimmt. eine andere DLL kann eine andere Funktion Übersetzungs installieren.

Die seTransFunction-Funktion, die Sie schreiben, muss eine Eingeboren-kompilierte Funktion handeln (kompiliert nicht mit /clr).Es muss eine ganze Zahl ohne Vorzeichen und einen Zeiger auf eine Struktur von Win32 _EXCEPTION_POINTERS als Argumente annehmen.Die Argumente sind die Rückgabewerte der Aufrufe zur Win32-API GetExceptionCode und GetExceptionInformation-Funktionen.

typedef void (*_se_translator_function)(unsigned int, struct _EXCEPTION_POINTERS* );

Für _set_se_translatorgibt jedoch Auswirkungen, wenn es an das CRT verknüpft, dynamisch _set_se_translator im Prozess eine andere DLL aufrufen und den Handler möglicherweise ersetzt durch eigene.

Wenn Sie _set_se_translator aus verwaltetem Code (der Code kompiliert mit /clr) oder gemischter eingeborener und verwalteten Code verwenden, beachten Sie, dass die Übersetzung der Ausnahmen auswirkt, die nur in systemeigenem Code generiert werden.Keine verwalteten Ausnahmen, die in verwaltetem Code generiert werden (z. B. wenn System::Exceptionausgelöst wird), werden nicht von der Übersetzung für Reservierungen weitergeleitet.Die Ausnahmen in verwaltetem Code mithilfe der Win32-Funktion RaiseException ausgelöst werden oder von einer System ausnahme wie eine Division durch null ausnahme verursacht werden, werden mit dem Konvertierungsprogramm weitergeleitet.

Anforderungen

Routine

Erforderlicher Header

_set_se_translator

<eh.h>

Die Funktionen, die von _set_se_translator bereitgestellt wird, ist nicht im Code verfügbar, der mit der /clr: pure-Compileroption kompiliert wird.

Weitere Informationen finden Sie unter Kompatibilität Kompatibilität in der Einführung.

Beispiel

// 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();
}
  
  

Obwohl die Funktionen, die von _set_se_translator bereitgestellt wird, nicht in verwaltetem Code verfügbar ist, kann diese Zuordnung in systemeigenem Code zu verwenden, auch wenn diese systemeigenen Code in einer Kompilierung mit dem Schalter /clr , sofern der systemeigene Code mithilfe #pragma unmanagedangegeben wird.Wenn eine strukturierte Ausnahme in verwaltetem Code ausgelöst wird, der zugeordnet werden soll, muss der Code, der generiert, und die Handles die Ausnahme mit pragmagekennzeichnet sind.Der folgende Code zeigt eine mögliche Verwendung beschrieben.Weitere Informationen finden Sie unter Pragma-Direktiven und das __Pragma-Schlüsselwort.

// 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;
}
  
  

.NET Framework-Entsprechung

Nicht zutreffend. Um die Standard-C-Funktion aufrufen, verwenden Sie PInvoke. Weitere Informationen finden Sie unter Plattformaufruf-Beispiele.

Siehe auch

Referenz

Ausnahmebehandlungs-Routinen

set_terminate (CRT)

set_unexpected (CRT)

Beenden Sie (CRT)

unerwartet (CRT)