- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
c异常处理总结
C++异常总结
C++异常处理机制核心观点: 0.如果使用普通的处理方式:ASSERT,return等已经 ?? 足够简洁明了,请不要使用异常处理机制. 1.比C的setjump,longjump优秀. 2.可以处理任意类型的异常. ?? 你可以人为地抛出任何类型的对象作为异常. ?? throw 100; ?? throw hello; ?? ... 3.需要一定的开销,频繁执行的关键代码段避免使用 ?? C++异常处理机制. 4.其强大的能力表现在: ?? A.把可能出现异常的代码和异常处理代码隔离开,结构更清晰. ?? B.把内层错误的处理直接转移到适当的外层来处理,化简了处理 ???? 流程.传统的手段是通过一层层返回错误码把错误处理转移到 ??? 上层,上层再转移到上上层,当层数过多时将需要非常多的判断, ??? 以采取适当的策略. ?? C.局部出现异常时,在执行处理代码之前,会执行堆栈回退,即为 ???? 所有局部对象调用析构函数,保证局部对象行为良好. ?? D.可以在出现异常时保证不产生内存泄漏.通过适当的try,catch ???? 布局,可以保证delete pobj;一定被执行. ?? E.在出现异常时,能够获取异常的信息,指出异常原因. ???? 并可以给用户优雅的提示. ?? F.可以在处理块中尝试错误恢复.保证程序几乎不会崩溃. ???? 通过适当处理,即使出现除0异常,内存访问违例,也能 ???? 让程序不崩溃,继续运行,这种能力在某些情况下及其重要. 以上ABCDEF可以使你的程序更稳固,健壮,不过有时让程序崩溃似乎更 容易找到原因,程序老是不崩溃,如果处理结果有问题,有时很难查找. 5.并不是只适合于处理灾难性的事件.普通的错误处理也可以用异常机制 ?? 来处理,不过如果将此滥用的话,可能造成程序结构混乱, ?? 因为异常处理机制本质上是程序处理流程的转移,不恰当的,过度的转移显然 ?? 将造成混乱.许多人认为应该只在灾难性的事件上使用异常处理,以避免异常 ?? 处理机制本身带来的开销,你可以认为这句话通常是对的. 6.先让程序更脆弱,再让程序更坚强.首先,它使程序非常脆弱,稍有差错,马上 ?? 执行流程跳转掉,去寻找相应的处理代码,以求适当的解决方式. ?? 很像一个人身上带着许多药品,防护工具出行,稍有头晕,马上拿出清凉油; ?? 遇到蚊子立刻拿出电蚊拍灭之.
(4月13号续)
7.在函数内部申请指针时,如果抛出异常,则余下的代码将被跳过,将导致资源泄漏,函数返回时局部对象总是被释放,无论函数是如何退出的。
8.使用灵巧指针(替代指针的对象)
例:void process(istream dataSource)
{
?? while(dataSource){
?? auto_ptrALApa(readALA(dataSource));
?? pa-process();
}
}
9.在构造函数中防止资源泄漏
C++确保删除空指针是安全的。
C++仅仅能删除被安全构造的对象,只有一个对象的构造函数完全运行完毕,这个对象才能被完全地构造。
C++拒绝为没有完成构造操作的对象调用析构函数是有一些原因的。(一般适用于在构造函数中有指针要初始化的情况)
常量指针如Image *const theImage 必须通过构造函数的成员初始化表来初始化
试着用灵巧指针来代替一般指针:
如const auto_ptrImagetheImage;//转化为auto_ptr对象
10.尽量使用析构函数防止资源泄漏,禁止异常信息传递到析构函数外
在析构函数释放对象时必须忽略掉所有它抛出的异常。
11.通过引用捕获异常
引用没有slicing problem,也即没有向上转型的问题。
12.异常规格指函数抛出异常的种类
函数若不带异常规格声明,则可以认为能抛出任何异常
func() throw();//不抛出任何异常
若抛出了不在异常列表中异常,则调用unexpected函数,我们可以使用不同的异常类型
替换unexpected异常,如set_unexpected(convertUnexpected),其中convertUnexpected函数中可以处理抛出异常的种类。
13.try catch的一种格式:
try{
}catch(...){}
异常不仅仅是写try和catch
14.编写异常安全代码时考虑三点因素:
(1)何时何地抛出异常:哪些代码应当抛出异常、哪些代码不应当抛出异常
(2)何时何地处理异常:哪些代码可以去捕获异常、哪些代码应当去捕获异常
(3)若被调用的函数都会抛出异常,我们的代码是否仍然安全呢?(使用良好
文档评论(0)