_set_se_translator
Обрабатывает исключения Win32 (структурированные исключения языка С) как типизированные исключения языка С++.
_se_translator_function _set_se_translator(
_se_translator_function seTransFunction
);
Параметры
- seTransFunction
Указатель на функцию-преобразователь структурированного исключения языка С, которую можно написать.
Возвращаемое значение
Возвращает указатель на предыдущую функцию-преобразователь, зарегистрированную _set_se_translator, чтобы предыдущую функцию можно было впоследствии восстановить. Если предыдущая функция не задана, то возвращаемое значение может использоваться для восстановления поведения по умолчанию; это значение может быть равно NULL.
Заметки
Функция _set_se_translator предоставляет способ обработки исключений Win32 (структурированных исключений языка C) как типизированных исключений C++. Чтобы разрешить обработчику catch языка С++ обрабатывать каждое исключение языка С, сначала следует определить класс-оболочку исключения языка С, которой может использоваться в качестве атрибута специального типа класса для исключений языка С или являться производным от него. Чтобы использовать этот класс, требуется установить пользовательскую функцию-преобразователь исключений языка C, которая вызывается внутренним механизмом обработки исключений при каждом возникновении исключения языка C. Внутри функции-преобразователя можно выбрасывать любое типизированное исключение, которое может быть перехвачено соответствующим catch языка С++.
Необходимо использовать /EHa при использовании _set_se_translator.
Чтобы указать пользовательскую функцию преобразования, вызовите функцию _set_se_translator , указав в качестве аргумента имя функции преобразования. Созданная функция-преобразователь вызывается по одному разу для каждого вызова функции для стека, имеющего блоки try . Не существует функции-преобразователя по умолчанию.
Функция-преобразователь не должна делать больше, чем выбрасывание типизированного исключения языка С++. Если она делает что-то в дополнение к выбрасыванию (например, запись в файл журнала), программа может вести себя не так, как ожидалось, поскольку число вызовов функции-преобразователя зависит от платформы.
В многопотоковой среде функции-преобразователи поддерживаются отдельно для каждого потока. Каждый новый поток требует установки собственной функции-преобразователя. Таким образом, каждый поток владеет собственной обработкой преобразования. _set_se_translator только на один поток; другая DLL может устанавливать другие функции преобразования.
Создаваемая функция seTransFunction должна быть скомпилирована как управляемая (скомпилирована не с /clr). Она должна принимать целое число без знака и указатель на структуру Win32 _EXCEPTION_POINTERS в качестве аргументов. Аргументы являются возвращаемыми значениями вызовов API Win32, функций GetExceptionCode и GetExceptionInformation соответственно.
typedef void (*_se_translator_function)(unsigned int, struct _EXCEPTION_POINTERS* );
Для _set_se_translator есть последствия динамического связывания с ЭЛТ; другая библиотека DLL в процессе может вызвать _set_se_translator и заменить обработчик собственным.
При использовании _set_se_translator из управляемого кода (кода, скомпилированного с /clr) или смеси управляемого и машинного кода, имейте в виду, что интерпретатор влияет на исключения, создаваемые только в машинном коде. Все управляемые исключения, создаваемые в управляемом коде (например, при вызове System::Exception) не маршрутизируются через функцию-преобразователь. Исключения, вызванные в управляемом коде с помощью функции RaiseException Win32, или вызванные исключением системы, такие как исключение деления на ноль, маршрутизируются через преобразователь.
Требования
Подпрограмма |
Обязательный заголовок |
---|---|
_set_se_translator |
<eh.h> |
Функциональные возможности, предоставляемые _set_se_translator, недоступны в коде, скомпилированном с помощью параметра компилятора /clr:pure.
Дополнительные сведения о совместимости см. в разделе Совместимость во введении.
Пример
// 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();
}
Хотя функциональные возможности, предоставляемые _set_se_translator, недоступны в управляемом коде, можно использовать это сопоставление в машинном коде, даже если этот машинный код скомпилирован с параметром /clr, если машинный код отображается с помощью #pragma unmanaged. Если в управляемом коде для сопоставления выброшено структурированное исключение, то код, создающий исключение и обрабатывающий его, должен быть помечен атрибутом pragma. В следующем коде показано возможное использование. Для получения дополнительной информации см. Директивы Pragma и ключевое слово __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;
}
Эквивалент в .NET Framework
Неприменимо. Для вызова стандартной функции C используйте PInvoke. Дополнительные сведения см. в разделе Примеры вызовов неуправляемого кода.