c/c++异常处理方法总汇

c/c++异常处理方法总汇

ID:5995008

大小:157.34 KB

页数:4页

时间:2017-12-30

c/c++异常处理方法总汇_第1页
c/c++异常处理方法总汇_第2页
c/c++异常处理方法总汇_第3页
c/c++异常处理方法总汇_第4页
资源描述:

《c/c++异常处理方法总汇》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、异常处理:C++异常和错误处理经验谈疯狂代码http://www.CrazyCoder.cn/ĵ:http:/www.CrazyCoder.cn/VC/Article13720.html代替try/catch/throw的通常做法是返回一个返回代码(有时称为错误代码),例如,printf(),scanf()和malloc()就是这样工作的:调用者通过if等语句来测试返回值判断函数是否成功。尽管返回代码技术有时是最适当的错误处理技术,但会增加不必要的if语句这样的令人讨厌的效果。质量降级:众所周知,条件语

2、句可能包含的错误大约十倍于其他类型的语句。因此,在其他都相同时,如果你能从代码中消除条件语句,你会得到更健壮的代码。推迟面市:由于条件语句是分支点,而它们关系到白盒法测试时的测试条件的个数,因此不必要的条件语句会增加测试的时间总量。如果你没有走过每个分支点,那么你的代码中就会有在测试中没有被执行过的指令,直到用户/客户发现它,那就糟糕了。增加开发成本:不必要的控制流程的复杂性增加了寻找bug,修复bug,和测试的工作。因此,相对于通过返回代码和if来报告错误,使用try/catch/throw所产生更少

3、有bug,更低的开发成本和更快面市的代码。如何处理构造函数的失败?构造函数没有返回类型,所以返回错误代码是不可能的。因此抛出异常是标记构造函数失败的最好方法。如果你没有或者不愿意使用异常,这里有一种方法。如果构造函数失败了,构造函数可以把对象带入一种“僵尸”状态。你可以通过设置一个内部状态位使对象就象死了一样,即使从技术上来说,它仍然活着。然后加入一个查询(“检察员”)成员函数,以便类的用户能够通过检查这个“僵尸位”来确定对象是真的活着还是已经成为僵尸(也就是一个“活着的死对象”)。你也许想有另一个成员

4、函数来检查这个僵尸位,并且当对象并不是真正活着的时候,执行一个no-op(或者是更令人讨厌的如abort())。这样做真的不漂亮,但是如果你不能(或者不想)使用异常的话,这是最好的方法了。如何处理析构函数的失败?往log文件中写一个消息。但不要抛出异常!C++的规则是你绝对不可以在另一个异常的被称为“栈展开(stackunwinding)”的过程中时,从析构函数抛出异常。举例来说,如果某人写了throwFoo(),栈会被展开,以至throwFoo()和}catch(Fooe){之间的所有的栈页面被弹出。

5、这被称为栈展开(statckunwinding)在栈展开时,栈页面中的所有的局部对象会被析构。如果那些析构函数之一抛出异常(假定它抛出一个Bar对象),C++运行时系统会处于无法决断的境遇:应该忽略Bar并且在}catch(Fooe){结束?应该忽略Foo并且寻找}catch(Bare){?没有好的答案——每个选择都会丢失信息。因此C++语言担保,当处于这一点时,会调用terminate()来杀死进程。突然死亡。防止这种情况的简单方法是不要从析构函数中抛出异常。但如果你真的要聪明一点,你可以说"当处理另

6、一个异常的过程中时,不要从析构函数抛出异常"。但在第二种情况中,你处于困难的境地:析构函数本身既需要代码处理抛出异常,还需要处理一些“其他东西”,调用者没有当析构函数检测到错误时会发生什么的担保(可能抛出异常,也可能做一些“其他事情”)。因此完整的解决方案非常难写。因此索性就做一些“其他事情”。也就是,不要从析构函数中抛出异常。当然,由于总有一些该规则无效的境况,这些话不应该被“引证”。但至少99%的情况下,这是一个好规则。如果构造函数会抛出异常,我该怎样处理资源?对象中的每个数据成员应该清理自己。如果

7、构造函数抛出异常,对象的析构函数将不会运行。如果你的对象需要撤销一些已经做了的动作(如分配了内存,打开了一个文件,或者锁定了某个信号量),这些需要被撤销的动作必须被对象内部的一个数据成员记住。例如,应该将分配的内存赋给对象的一个“智能指针”成员对象Fred,而不是分配内存给未被初始化的Fred*数据成员。这样当该智能指针消亡时,智能指针的析构函数将会删除Fred对象。标准类auto_ptr就是这种“智能指针”类的一个例子。你也可以写你自己的引用计数智能指针。当别人抛出异常时,我如何改变字符数组的字符串长

8、度来防止内存泄漏?如果你要做的确实需要字符串,那么不要使用char数组,因为数组会带来麻烦。应该用一些类似字符串类的对象来代替。例如,假设你要得到一个字符串的拷贝,随意修改这个拷贝,然后在修改过的拷贝的字符串末尾添加其它的字符串。字符数组方法将是这样:voiduserCode(constchar*s1,constchar*s2){//制作s1的拷贝:char*copy=newchar[strlen(s1)+1];strcpy(copy,s1

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。