_set_se_translator
Обрабатывает исключения структурированные исключения Win32 (C++, c#) как введенные исключения.
_se_translator_function _set_se_translator(
_se_translator_function seTransFunction
);
Параметры
- seTransFunction
Указатель на составной c функции преобразователя исключения, написанный.
Возвращаемое значение
Возвращает указатель на предыдущую функции преобразователя зарегистрированной by _set_se_translatorфункция previous, так что можно восстановить более поздней версии.Если функция previous не задана, то возвращаемое значение может использоваться для получения по умолчанию применяются расширения функциональности; это значение может быть равно null.
Заметки
_set_se_translator функция предоставляет способ обработки структурированных исключений Win32 (c#) исключения как исключения, типизированные C++.Включение каждому исключение c#, чтобы обрабатываться C++ catch обработчик, сначала определяет класс-оболочку исключения c которой может использоваться или является производным от класса, к атрибуту определенный тип исключения ЯЗЫКА c.Для использования этого класса, install пользовательской функции преобразователя исключения c#, которая вызывается внутренним исключением c механизма обработки ошибок каждый раз, когда возникнет.Внутри функции преобразователя можно создать любое типизированное исключение, может быть перехвачено соответствующий C++ catch обработчик.
Необходимо использовать /EHa при использовании _set_se_translator.
Определить настраиваемую функцию перевода, вызов _set_se_translatorс именем своей функции преобразования в качестве аргумента.Функция преобразователя, написании вызывается один раз для каждого вызова функции в стеке, имеющий tryблоки.По умолчанию отсутствует функция преобразователя.
Функция переводчика не должна выполнять не более чем на языке C++ выдает исключение. печатанное.Если она выполняет никаких действий в дополнение к генерации (такие как запись в файл журнала, например программа не может вести себя как предпологаема, поскольку количество повторных функция вызывается преобразователь платформа-зависимая ячейка.
В многопоточной среде поддерживаются функции переводчика отдельно для каждого потока.Каждому новому потоку требуется устанавливать собственную функцию преобразователя.Таким образом, каждый поток в попечении собственный обработка перевода._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динамическое связывание проблемы, если на CRT. другие библиотеки DLL в процессе может вызвать _set_se_translator и замените обработчик с ее.
При использовании _set_se_translator из управляемого кода (компилированного кода с /clr) или смешанного собственного и управляемого кода, имейте в виду, что транслятор влияет на исключения, создаваемые в машинном коде.Все управляемые исключения, созданные в управляемом коде (например, вызывающего System::Exceptionнаправьте) не через функцию преобразователя.Исключения, вызванные в управляемом коде с помощью функций Win32 RaiseException или вызвано исключением системы, как деление на ноль направить с помощью преобразователя.
Требования
Процедура |
Обязательный заголовок |
---|---|
_set_se_translator |
<eh.h> |
Функциональные возможности, предоставляемые by _set_se_translator недоступны в компилированном коде с /clr: чистые параметр компилятора.
Дополнительные сведения о совместимости см. Совместимость во введении.
Пример
// 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();
}
Хотя функциональные возможности обеспечила by _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. Дополнительные сведения см. в разделе Примеры вызовов неуправляемого кода.