您的位置:首页 > 编程语言 > C语言/C++

C++编程->异常处理的三重境界

2014-04-04 11:02 176 查看
有关异常的C++编程,有三个境界:

#第一个境界就是:程序中看到不try,catch,finally。
这是新手的水平,他不知道有的模块/函数是会有异常抛出的,不处理的话,程序会当掉,很多资源会不能及时正确回收。或者他写程序时反复应用errno或者检查返回值的方式来处理异常情况,排错代码和正常流程代码搅在一起,混乱不堪。

#第二个境界就是:程序中看到好多好多try,catch,finally。
这是入门级的水平,他懂得利用抛异常的方式来处理错误情况,所以在程序中,正常的流程会统一在try里,各种错误处理,都安排在catch当中,小心翼翼地做好的善后工作。有时候狠起来还使用catch(...)来强行把所有的异常都压下来。这样没有什么混乱?才怪,各种善后处理虽然都做了,但是他不知道要写多少个try,多少个catch,而且经常要把思路放到catch当中去。

#第三个境界就是:程序中还是看到不try,catch,finally。
然而有不同,这一回他是手中无剑心有剑的高手境界了。
他知道异常安全的三个保证,并且懂得在什么时候分别提供#资源回收保证#数据一致性保证#无异常保证。
---他会使用C++超强的RAII(资源获取即初始化)来使得资源在产生异常时会自动回收(写一个类就可以管理一种资源,一劳永逸,不用天天catch来catch去)。
---他会使用pimpl技法(我比较喜欢叫它疙瘩技法)帮助实现RAII,并把逻辑操作分派到各个成员内部当中,使之在发生异常时保持一致性。
---他另外还会常常使用一个no throw的swap操作一次性把所有的操作完成。这样的话,对象就不会成为烂尾楼。
于是,这个高手写的类自己不用异常来打扰你,如果真的在内部其它类发生了异常,这个异常也安全地透过这个高手的类传到更上一层去,不破坏类本身的数据完整性。虽然异常还会有,但是,安全了~

所以综合来说,要写好一个异常安全的模块,最好有几个东东要牢记于心~::
异常(它会出现),RAII,pimpl,数据一致性,swap。
如果忘了,可以翻出boost::shared_ptr的源程序好好看一遍。(这句话其实没敢跟师兄说)

其实少用try catch,是对于一个相对的说法。当知道一个模块要通过抛异常来报告错误,并且这个错误的处理责任是模块调用者时,就应当使用try,别把异常给漏了。比如说boost::lexical_cast的用户~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐