[原创文章欢迎转载,但请保留作者信息]
Justin 于 2009-11-04
在析构函数中不能抛出异常。
这个其实比较容易理解:异常不像函数调用,一旦抛出(throw),就回不来了。如果在析构函数中抛出了异常,有一部分释放/摧毁对象成员的操作可能就无法进行。因为某个异常,导致了所在的析构函数无法完成全部析构任务。
一颗老鼠屎毁了一锅汤啊……
可是要是真的需要对析构动作中出现的错误/异常进行处理咋办?书中自有解决方案:从差的到好的。
-
在析构函数内布置catch,一旦发生异常就会被捕获,然后简单调用std::abort自杀@#¥%
点评:干脆是干脆了,但是这样猝死会不会有点太突然?
-
也是在函数内布置catch,但是遇到异常就把它直接吃到肚子里(大师语:Swallow the exception)。在析构函数外不会有人知道有什么不好的事发生,catch肚子里嘭的一声响,它除了打了个嗝,没有什么危险……
点评:一般不该这样处理,毕竟发生了不好的事。但如果真的想要程序继续带伤上阵,也确定这样不会有问题,那也不会有人有意见。
-
除了在函数里布置catch,并采用以上任一方法,另外实现一个可供用户调用的函数接口,用来处理这些有可能出错的析构工作。
点评:大师给予这个方案高度的评价,因为这样不但有以上两种方法的效果,还给用户一个参与处理异常的机会(调用接口函数)。如果用户没有(或者忘记)用该函数处理析构的动作,那么析构函数也会自觉挑起这个任务。而这个时候如果还出问题,用户也没有什么理由来责怪了:是你自己不想要管的!