Note of Justin

关于工作和读书的笔记

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  47 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks

留言簿(14)

搜索

  •  

积分与排名

  • 积分 - 50797
  • 排名 - 433

最新评论

阅读排行榜

评论排行榜

[原创文章欢迎转载,但请保留作者信息]

Justin 于 2009-11-04

在析构函数中不能抛出异常。

这个其实比较容易理解:异常不像函数调用,一旦抛出(throw),就回不来了。如果在析构函数中抛出了异常,有一部分释放/摧毁对象成员的操作可能就无法进行。因为某个异常,导致了所在的析构函数无法完成全部析构任务。

一颗老鼠屎毁了一锅汤啊……

可是要是真的需要对析构动作中出现的错误/异常进行处理咋办?书中自有解决方案:从差的到好的。

  • 在析构函数内布置catch,一旦发生异常就会被捕获,然后简单调用std::abort自杀@#¥%
    点评:干脆是干脆了,但是这样猝死会不会有点太突然?
  • 也是在函数内布置catch,但是遇到异常就把它直接吃到肚子里(大师语:Swallow the exception)。在析构函数外不会有人知道有什么不好的事发生,catch肚子里嘭的一声响,它除了打了个嗝,没有什么危险……
    点评:一般不该这样处理,毕竟发生了不好的事。但如果真的想要程序继续带伤上阵,也确定这样不会有问题,那也不会有人有意见。
  • 除了在函数里布置catch,并采用以上任一方法,另外实现一个可供用户调用的函数接口,用来处理这些有可能出错的析构工作。
    点评:大师给予这个方案高度的评价,因为这样不但有以上两种方法的效果,还给用户一个参与处理异常的机会(调用接口函数)。如果用户没有(或者忘记)用该函数处理析构的动作,那么析构函数也会自觉挑起这个任务。而这个时候如果还出问题,用户也没有什么理由来责怪了:是你自己不想要管的!
posted on 2009-12-16 15:40 Justin.H 阅读(1406) 评论(0)  编辑 收藏 引用 所属分类: Effective C++ 炒冷饭

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