以前一直疑惑,为啥不是一层层的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变量,然后自己处理其初始化。