如果一个函数内使用了异常处理机制, VC 编译器在编译该函数时,它会给此函数插入一些“代码和信息”(代码指的是当该函数中出现异常时的回调函数,而信息主要是指与异常出现相关的一些必要的链表),因此每份函数只能有一份这样的东东(“代码和信息”),故一个函数只能采用一种形式的异常处理规则。

上图中黄色部分就是新添加的异常信息,通过stack unwinding来实现局部变量的析构函数自动调用。所以在析构函数中不能抛出异常(http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr155.htm)
具体的异常信息分析见参考url.

/**************/
干货2
/**************/
好,你以为你理解了么,那么看下面的例子:

  1. #include <stdio.h>
  2. class A
  3. {
  4. public:
  5. A() {printf(" 构造一个 A 对象 n");}
  6. ~A() {printf(" 析构一个 A 对象 n");}
  7. void f1() {}
  8. void f2() {}
  9. };
  10. void main()
  11. {
  12. __try
  13. {
  14. A a1, a2;
  15. puts("in try");
  16. } __except(puts("in filter 1"), 1)
  17. {
  18. puts("in except 1");
  19. }
  20. }

编辑结果:
1>c:\users\junliang-aya\documents\visual studio 2008\projects\test\test\main.cpp(18) : warning C4509: 使用了非标准扩展:“main”使用 SEH,并且“a2”有析构函数
1>        c:\users\junliang-aya\documents\visual studio 2008\projects\test\test\main.cpp(16) : 参见“a2”的声明
1>c:\users\junliang-aya\documents\visual studio 2008\projects\test\test\main.cpp(18) : warning C4509: 使用了非标准扩展:“main”使用 SEH,并且“a1”有析构函数
1>        c:\users\junliang-aya\documents\visual studio 2008\projects\test\test\main.cpp(16) : 参见“a1”的声明
1>c:\users\junliang-aya\documents\visual studio 2008\projects\test\test\main.cpp(22) : error C2712: 无法在要求对象展开的函数中使用 __try

why?

因为只要有局部对象存在,就一定会存在c++异常处理机制try/catch,而你又调用__try/__except, 一个函数中只能有一种异常处理机制,所以出错。

参考:
http://baiy.cn/doc/cpp/inside_exception.htm
http://blog.pfan.cn/mroske/9865.html

使用了非标准扩展:“xxx”使用 SEH,并且“xxx”有析构函数的更多相关文章

  1. 使用caddy实现非标准端口https

    近来使用Halo搭建博客,并顺便把WeHalo小程序也把玩了起来,但是发现几个非常棘手的问题: 根据访问日志发现有三方在刷取关键接口的请求,http请求在部分情况下会暴露出很显著的安全问题: 小程序强 ...

  2. Linux BSP非标准HDMI分辨率

    Linux BSP非标准HDMI分辨率 Intrinsyc公司发布了它的一个新的Linux BSP软件的发布 打开-Q820 开发套件基于Linux内核版本.支持的软件功能包括HDMI输出,可以支持标 ...

  3. Python解析非标准JSON(Key值非字符串)

    采集数据的时候经常碰到一些JSON数据的Key值不是字符串,这些数据在JavaScript的上下文中是可以解析的,但在Python中,没有该部分数据的上下文,无法采用json.loads(JSON)的 ...

  4. [Effective JavaScript 笔记]第29条:避免使用非标准的栈检查属性

    许多js环境都提供检查调用栈的功能.调用栈是指当前正在执行的活动函数链.在某些旧的宿主环境中,每个arguments对象含有两个额外的属性:arguments.callee和arguments.cal ...

  5. Wireshark分析非标准端口号流量

    Wireshark分析非标准端口号流量 2.2.2  分析非标准端口号流量Wireshark分析非标准端口号流量 应用程序运行使用非标准端口号总是网络分析专家最关注的.关注该应用程序是否有意涉及使用非 ...

  6. 转 在无法通过yum下载非标准包时,怎么办

    在CentOS下,我们可以通过yum来下载或更新rpm包,但是标准的源(repository)里只提供一部分的rpm包,虽然大部分情况下,这些包是够用的.但是有时候还是需要下载其他的一些非标准的包,如 ...

  7. python之读取配置文件模块configparser(三)高级使用---非标准配置文件解析

    非标准配置文件也是经常使用的,如何使用configparser来解析? 这要从configparser本身解析结构来说,configparser包含section和option,非标准配置文件只有op ...

  8. 有一个VC的bug:非标准语法

    ---恢复内容开始--- 主函数中调用类的成员函数时报错: “error C3867:非标准语法:请使用 "&" 来创建指向成员的指针” 这时在函数前老老实实加上& ...

  9. SQL 将非标准日期格式转换成标准格式,进行条件判断

    a.JLDate为非标准日期格式: 例: 2011-8-28 0:00:000011-8-28 0:00:000111-8-4 0:00:00 select CONVERT(varchar(50),C ...

随机推荐

  1. 桌面虚拟化之部署DDC-5.6

    1. 打开管理软件 2. 选择桌面部署 3. 如果没有数据库则使用默认的 4. 导入许可证文件(当然未申请可试用30天) 5. 主机类型选择无(这里未做服务器虚拟化) 6. 最后完成初步配置 配置计算 ...

  2. 【Linux C中文函数手册】之 内存和字符串函数

    内存和字符串函数 1) bcmp 比较内存内容 相关函数 bcmp,strcasecmp,strcmp,strcoll,strncmp,strncasecmp表头文件 #include<stri ...

  3. 集合类学习之HashMap

    一.HashMap概述 HashMap基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了不同步和允许使用 null 之外,HashMap  ...

  4. c#实现数据集合转换为csv文本

    需求 1.将一个数据集合导出到一个csv文件中,集合类型可以视为 List<T>,T为任意类型,T包含多个属性,可指定部分属性进行导出 2.软件中有多种不同类型的数据类型需要进行导出 需求 ...

  5. AMQ学习笔记 - 14. 实践方案:基于ZooKeeper + ActiveMQ + replicatedLevelDB的主从部署

    概述 基于ZooKeeper + ActiveMQ + replicatedLevelDB,在Windows平台的主从部署方案. 主从部署可以提供数据备份.容错[1]的功能,但是不能提供负载均衡的功能 ...

  6. 将string转换成char*

    string 是c++标准库里面其中一个,封装了对字符串的操作  把string转换为char* 有3中方法:  1.data  如:  string str="abc";  ch ...

  7. 洛谷 1865 A%B问题

    题目背景 题目名称是吸引你点进来的 实际上该题还是很水的 题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m 接下来n行,每行两个整数 l,r 表示区间 输出格式: 对 ...

  8. F. Igor and Interesting Numbers

    http://codeforces.com/contest/747/problem/F cf #387 div2 problem f 非常好的一道题.看完题,然后就不知道怎么做,感觉是dp,但是不知道 ...

  9. mysql:The total number of locks exceeds the lock table size

    使用mysql InnoDB存储引擎进行大量数据的更新,删除的时候容易引发”The total number of locks exceeds the lock table size”问题,解决方法之 ...

  10. 试写Python内建函数range()

    还没查阅源码,先试着练手 class my_range(object): def __init__(self, *args): if not args: raise TypeError, 'range ...