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


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

См. также

Ссылки

Процедуры обработки исключений

set_terminate (CRT)

set_unexpected (CRT)

terminate (CRT)

unexpected (CRT)