关于C++异常的stack unwinding

以前一直疑惑,为啥不是一层层的unwinding,而是要在找到一个handle并把控制权转移到catch块这里再unwinding。想了想是这样:
1.保存异常抛出点的现场(也就是stack)是有用的,比方说,在handle里面就有可能一层一层往回遍历stack frame,像python的sys.get_frame
2.exception对象就在顶层stack frame上,一unwinding,就给unwinding没有了,如果找个地方给保存下来,那么这个exception对象是要拷贝构造的,问题就复杂了(当然catch的时候也是要拷贝构造)。
3.未catch的异常是不是会去stack unwinding是依赖实现的,因此,要保证resource cleanup,就应该自己搞个入口函数,这个入口函数在main里面一个try块里面调用,捕获所有异常
4.static和全局变量的异常安全问题,static和全局变量初始化时候抛出异常,构造完成的其他static和全局变量不一定会被析构(实现定义),所以最好用local static变量,然后自己处理其初始化。

posted on 2011-07-17 04:09 qingant 阅读(2579) 评论(2)  编辑 收藏 引用

评论

# re: 关于C++异常的stack unwinding 2011-07-17 22:21 陈梓瀚(vczh)

其实从C++的语义上来讲,就算一边unwinding一边找catch,也是可以实现成标准那个样子的。我觉得这个估计还是跟x86有关系的。因为SEH其实cpu是有份实现的。譬如为什么exception handler要放在FS:[0],为什么那个指针指向的链表必须是那个结构,等等。  回复  更多评论   

# re: 关于C++异常的stack unwinding 2011-07-18 01:03 qingant

@陈梓瀚(vczh)
标准说了:
As control passes from a throw-expression to a handler, destructors are invoked for all automatic objects constructed since the try block was entered. The automatic objects are destroyed in the reverse order of the completion of their construction.

实现上一边unwinding一边找catch没问题吧。过阵子较闲了再来看看
具体实现吧。 :)  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


导航

<2011年7月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

统计

常用链接

留言簿(3)

随笔档案

相册

最新随笔

搜索

最新随笔

最新评论

阅读排行榜

评论排行榜