l structured_exception的构造函数接收并解析seh异常的信息。
l what()返回seh异常的异常码。
l where()返回seh异常发生的地点。注意,where()的返回类型是void const *,虽然c++标准不同意将代码地址转换为void指针。我只是重复了micorsoft的用法,因为visual c++运行库将地址存在了seh异常的exception_record的一个void *成员中了。
编译并链接这三个文件。运行结果是:
caught c++ exception c0000005 thrown from 0040181d
(其中的代码地址值在你的系统上可能有所不同。)
1.3 version 3:模仿c++标准运行库
在my_translator()中,所有的seh异常映射为同样的structured_exception类型。这使得异常容易被捕获,因为它们匹配于我们的唯一的异常处理函数:
catch (structured_exception const &exception)
虽然捕获了异常,但我们没有办法事先知道异常的类型。唯一能做的是运行期查询,调用这个异常的what()成员:
catch (structured_exception const &exception)
{
switch (exception.what())
{