Udostępnij za pośrednictwem


_set_se_translator

Obsługuje wyjątki Win32 (C strukturę wyjątki) C++ wpisanych wyjątki.

_se_translator_function _set_se_translator(
   _se_translator_function seTransFunction
);

Parametry

  • seTransFunction
    Wskaźnik c struktury funkcji Tłumacz wyjątków, że piszesz.

Wartość zwracana

Zwraca wskaźnik do poprzedniej funkcji Tłumacz zarejestrowanych przez _set_se_translator, dzięki czemu można później przywrócone poprzednie funkcji.Jeśli nie ustawiono żadnej funkcji poprzednich, zwracana wartość może służyć do przywrócić domyślne zachowanie; wartość ta może być NULL.

Uwagi

_set_se_translator Funkcja zapewnia sposób obsługi wyjątków systemu Win32 (C strukturę wyjątki) C++ wpisanych wyjątki.Aby umożliwić każdy wyjątek c do obsługi przez C++ catch obsługi, najpierw zdefiniować klasy otoki wyjątek C, która może być używany lub pochodzi od atrybutu typu określonej klasy c wyjątku.Aby użyć tej klasy, należy zainstalować funkcję translator niestandardowe wyjątek C, która jest wywoływana przez wewnętrznego mechanizmu obsługi wyjątków każdorazowo c wyjątek.W ramach funkcji translatora można throw maszynowy wyjątek, który można złowionych przez pasujące C++ catch obsługi.

Należy użyć /EHa podczas korzystania z _set_se_translator.

Aby określić funkcję tłumaczenia niestandardowe, należy wywołać _set_se_translator o nazwie tłumaczenie funkcji jako argumentu.Można napisać funkcję Tłumacz jest wywoływana raz dla każdego wywołania funkcji na stosie, który ma try bloków.Nie ma żadnej funkcji Tłumacz domyślne.

Funkcja Tłumacz należy wykonać nie więcej niż throw C++ wpisane wyjątek.Jeśli coś oprócz rzuca (takie jak na przykład zapisywania do pliku dziennika) program może nie działać zgodnie z oczekiwaniami, ponieważ liczba wywoływana jest funkcja Tłumacz jest zależne od platformy.

W środowisku wielowątkowym Tłumacz funkcje są obsługiwane osobno dla każdego wątku.Każdy nowy wątek musi zainstalować ma własną funkcję translatora.W ten sposób każdy wątek jest odpowiedzialny za obchodzenie tłumaczenia._set_se_translator jest specyficzne dla jednego wątku; inna biblioteka DLL można zainstalować translacji różnych funkcji.

seTransFunction Funkcji pisania musi być funkcja skompilowany w trybie macierzystym (nie skompilowany z/CLR).Musi ono podjąć nieoznaczoną liczbę całkowitą i wskaźnik do Win32 _EXCEPTION_POINTERS struktury jako argumenty.Argumenty są zwracane wartości wywołania interfejsu Win32 API GetExceptionCode i GetExceptionInformation funkcji, odpowiednio.

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

Dla _set_se_translator, są implikacje podczas łączenia dynamicznie CRT; inna biblioteka DLL w procesie może wywołać _set_se_translator i zastąpić nasza procedura obsługi własnej.

Podczas korzystania z _set_se_translator z kodu zarządzanego (kod skompilowany z/CLR) lub mieszane macierzystych i zarządzany kod, należy pamiętać, translator ma wpływ na wyjątki generowane w tylko kodu macierzystego.Zarządzane dowolne wyjątki generowane w kodzie zarządzanym (np. przy podnoszenie System::Exception) nie są wysyłane za pośrednictwem funkcji translatora.Wyjątki wywoływane w kodzie zarządzanym przy użyciu funkcji Win32 RaiseException lub spowodowane wyjątek systemu, takie jak dzielenie przez zero wyjątków są wysyłane za pośrednictwem translatora.

Wymagania

Rozpoczęto wykonywanie procedury

Wymaganego nagłówka

_set_se_translator

<eh.h>

Funkcje dostarczane przez _set_se_translator nie jest dostępny w kod skompilowany z /CLR: czysty opcję kompilatora.

Informacji dotyczących zgodności, zobacz zgodności we wprowadzeniu.

Przykład

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

Chociaż funkcjonalność dostarczonych przez _set_se_translator jest niedostępne w kodzie zarządzanym, jest możliwe wykorzystanie to mapowanie kodu macierzystego, nawet jeśli ten kod macierzysty kompilacji pod /clr przełączyć, jak długo kodu macierzystego jest wskazany za pomocą #pragma unmanaged.Jeśli structured jest jest wyjątek w kodzie zarządzanym, który ma być mapowana, muszą być oznaczone kod, który generuje i obsługuje dany wyjątek pragma.W poniższym kodzie pokazano możliwe użycia.Aby uzyskać więcej informacji, zobacz Dyrektywy pragma i __Pragma słowa kluczowego.

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

Odpowiednik w programie .NET Framework

Nie dotyczy. Aby wywołać standardowych funkcji C, należy użyć PInvoke. Aby uzyskać więcej informacji, zobacz Przykłady wywołać platformy.

Zobacz też

Informacje

Procedur obsługi wyjątków

set_terminate (CRT)

set_unexpected (CRT)

terminate (CRT)

unexpected (CRT)