Поделиться через


_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. Дополнительные сведения см. в разделе Примеры вызовов неуправляемого кода.

См. также

Ссылки

Подпрограмм обработки ошибок

set_terminate (CRT)

set_unexpected (CRT)

terminate (CRT)

unexpected (CRT)