_set_se_translator
Obsługuje wyjątki Win32 (wyjątki strukturalne języka C) jako wyjątki typu C++.
_se_translator_function _set_se_translator(
_se_translator_function seTransFunction
);
Parametry
- seTransFunction
Wskaźnik do C struktury funkcji Tłumacz wyjątek, która piszesz.
Wartość zwracana
Zwraca wskaźnik do poprzednich funkcji Tłumacz zarejestrowane przez _set_se_translator, dzięki czemu może później przywrócić poprzedniego funkcję.Jeśli nie ustawiono żadnych poprzednich funkcji, zwracana wartość można 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) jako C++ wpisane wyjątki.Aby umożliwić każdy wyjątek C może być obsługiwanych przez C++ catch obsługi, najpierw zdefiniować klasy otoki wyjątek C, który może być używany lub pochodną do przeznaczania na wyjątek C typ określonej klasy.Aby użyć tej klasy, należy zainstalować niestandardowe C wyjątek Tłumacz funkcję, która jest wywoływana przez wewnętrzny mechanizm obsługi wyjątków każdorazowo C jest wyjątek.W ramach swojej funkcji Tłumacz można rzucić każdy wpisany wyjątek, który może podlegać pasujące C++ catch obsługi.
Należy użyć /EHa podczas korzystania z _set_se_translator.
Aby określić funkcję tłumaczenia niestandardowe, wywołanie _set_se_translator z nazwą funkcji tłumaczenia jako argument.Funkcja Tłumacz, że piszesz jest wywoływana raz dla każdego wywołania funkcji na stosie, który ma try bloków.Nie ma żadnych funkcję translatora domyślne.
Funkcja Tłumacz należy zrobić nie więcej niż rzucać C++ wpisane wyjątek.Jeśli oprócz rzucanie (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.Tak więc każdy wątek jest odpowiedzialny za obchodzenie tłumaczenia._set_se_translator specyficzne dla jednego wątku; innym DLL można zainstalować funkcję inne tłumaczenie.
seTransFunction Funkcji, że piszesz musi być funkcją skompilowany w trybie macierzystym (nie skompilowany z/CLR).Musi ona całkowitą bez znaku 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; nazwać innej biblioteki DLL w procesie _set_se_translator i zastąpić program obsługi własnej.
Podczas korzystania z _set_se_translator z kodu zarządzanego (kod skompilowany z/CLR) lub mieszane kodu macierzystego i zarządzanego, należy pamiętać, że translator wpływa na wyjątki generowane w kodzie macierzystym tylko.Zarządzane dowolne wyjątki generowane w kodzie zarządzanym (jak np. przy podnoszenie System::Exception) nie są kierowane przez funkcję translatora.Wyjątki wywoływane w kodzie zarządzanym przy użyciu funkcji Win32 RaiseException lub spowodowane wyjątek systemu, jak dzielenie przez zero wyjątków są wysyłane za pośrednictwem translatora.
Wymagania
Procedura |
Wymagany nagłówek |
---|---|
_set_se_translator |
<EH.h> |
Funkcje udostępniane przez _set_se_translator nie jest dostępny w kod skompilowany z /CLR: pure opcję kompilatora.
Aby uzyskać więcej informacji na temat zgodności, zobacz Zgodność we Wstępie.
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();
}
Mimo, że funkcjonalność dostarczonych przez _set_se_translator jest nie są dostępne w kodzie zarządzanym, to można korzystać z tego mapowania w kodzie macierzystym, nawet jeśli tego kodu macierzystego jest w zestawieniu pod /clr przełączyć, tak długo, jak długo kodu macierzystego jest wskazany za pomocą #pragma unmanaged.Jeśli jest zorganizowany wyjątek w kodzie zarządzanym, która ma być mapowana, kod, który generuje i obsługuje dany wyjątek musi być oznaczone pragma.W poniższym kodzie pokazano możliwe wykorzystanie.Aby uzyskać więcej informacji, zobacz Dyrektywy pragma i słowo kluczowe __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;
}
Odpowiednik w programie .NET Framework
Nie dotyczy. Aby wywołać standardową funkcję C, należy użyć PInvoke. Aby uzyskać więcej informacji, zobacz Przykłady wywoływania platformy.