转换函数接受一个seh异常(通过给定的异常code和info来定义的)。然后抛出一个c++异常,以此将传入的seh异常映射为向外传的c++异常。这个c++异常将出现在原来的seh异常发生点上并向外传播。
这个机制非常象std::set_terminate()和std::set_unexpected()。要安装转换函数,要调用visual c++库函数_set_se_translator()。这个函数申明在头文件eh.h中:
typedef void (*_se_translator_function)(unsigned, exception_pointers *);
_se_translator_function _set_se_translator(_se_translator_function);
它接受一个指向新转换函数的指针,返回上次安装的指针。一旦安装了一个转换函数,前一次的就丢失了;任何时候只有一个转换函数有效。(在多线程程序中,每个线程有一个独立的转换函数。)
如果还没安装过转换函数,第一次调用_set_se_translator()返回值可能是(也可能不是)null。也就是说,不能不分青红皂白就通过其返回的指针调用函数。很有趣的,如果返回值是null,而你又通过此null调用函数,将产生一个seh异常,并且进入你刚刚安装的转换函数。
一个简单的例子:
#include <iostream>
using namespace std;
int main()
{
try
{
*(int *) 0 = 0; // generate structured exception
}
catch (unsigned exception)