_set_se_translator

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

_se_translator_function _set_se_translator(
   _se_translator_function seTransFunction
);

参数

  • seTransFunction
    对 c. 的指针结构化异常该转换器的功能编写。

返回值

返回指向 _set_se_translator签入以前的转换器功能,因此,可在以后恢复前面的功能。 如果以前功能未设置,则返回值可用于还原默认行为;此值可以为空。

备注

_set_se_translator 功能提供处理 Win32 异常 (C 结构化异常) 作为 C++ 类型化一种异常。 若要允许每个 C 异常由 c. C++ catch 处理程序,请先定义 c. 异常可以使用或派生自的包装类,将属性设置为 c. 异常的特定类类型。 若要使用此类,请安装由内部异常处理机制 c. 异常调用每次引发的自定义 C 异常转换器功能。 在转换器函数中,可以引发可被匹配的 C++ catch 处理程序捕获的所有类型化异常。

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

若要指定自定义转换功能,请调用相关的函数的名称 _set_se_translator作为其参数。 转换器功能编写为具有 try的堆栈中的每个函数调用一次调用块。 无默认转换器功能。

应执行不多于引发 c. 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 并用自己替换处理程序。

当使用托管代码 (该代码用 /clr 编译时) 或混合本机代码和托管代码的 _set_se_translator ,请注意转换器影响仅在本机代码生成的异常。 在托管代码生成的任何托管异常 (例如,当引发 System::Exception) 时未通过转换器功能进行路由。 与一个异常的系统引发异常在托管代码中使用 Win32 函数 RaiseException 或引发的异常被零异常通过转换器路由。

要求

实例

必需的头

_set_se_translator

eh.h

_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();
}
      

虽然 _set_se_translator 提供的功能不可用在托管代码中,使用映射的此在本机代码是可以的,因此,即使该本机代码在生成在 /clr 开关下,使用 #pragma unmanaged,,只要本机代码所示。 如果结构化异常在要映射的托管代码引发,生成的标记的代码并处理异常由 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)