_set_se_translator

处理作为 C++ 键入异常的 Win32 异常 (C 结构化异常) 。

_se_translator_function _set_se_translator(
   _se_translator_function seTransFunction
);

参数

  • seTransFunction
    指向您编写的C结构化异常转换器函数的指针。

返回值

返回指向由 _set_se_translator 注册的前终端转换函数,以便前面的函数之后可能还原。 如果以前尚未设置函数,返回值可用于存储默认行为;此值可能为 NULL。

备注

_set_se_translator 函数提供一种方法处理 Win32异常 (C# 结构化异常) 作为 C++ 类型的异常。 若要允许每个异常由C++ catch 处理程序处理,请首先定义一个可用的C异常包装类,或者为指定的类传递C异常。。 若要使用此类,请安装 C 异常时由内部异常处理机制调用的自定义 C 异常转换函数。 在转换器函数内,则可以引发通过匹配 C++ catch 处理程序捕捉的任何类型化异常。

在使用 _set_se_translator时,必须使用。/EHa

若要指定自定义转换函数,请使用您的转换函数的名称作为_set_se_translator 的单一参数来调用它。 您编写的转换函数对具有try 块的堆栈上的每个函数调用一次。 无默认转换器函数。

转换器函数应执行不多于引发 C++ 类型异常。 如果它进行任何操作除了引发。例如 (如写入日志文件),程序可能不会以预期,转换器,因为函数调用的次数与平台依赖项。

在多线程环境中,每个线程都是单独维护转换函数。 每个新线程需要安装自己的转换函数。 因此,每个线程都控制自己终转换处理。 _set_se_translator 特定于一个线程;另一个 DLL 来安装不同的转换函数。

您编写的是本机 seTransFunction 函数必须编译的函数 (不使用 /clr 编译。)。 它必须采用无符号整数和指针到 Win32 _EXCEPTION_POINTERS 结构作为参数。 参数分别返回值调用 Win32 API 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>

_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)