Effective c++学习笔记——条款08:别让异常逃离析构函数
Prevent exceptions from leaving destructors 本条款主要讲述当我们写代码的时候,如果出现了异常,让我们如何对异常处理,如何更加安全的处理异常。让我们的代码看起来更加完美。 1、 问题来源 案例1 由于C++并不禁止析构函数吐出异常,但它并不鼓励你这么做,所以,当我们不小心写出了问题代码的时候。考虑下面的代码: c++并不禁止析构函数吐出异常,但它并不鼓励你这么做。考虑下面的代码: class Widget { public: ~Widget(){...} //假设这个可能吐出一个异常 }; void dosomething() { vector<Widget> v; } //v在这里被自动销毁 当vector被销毁,它有责任销毁其内含的所有Widgets。假设v内含十个Widgets,而在析构第一个元素期间,有个异常被抛出。其他九个widgets还是应该被销毁,因此v应该调用它们各个析构函数。但假设在那些调用期间,第二个widget析构函数又抛出异常。现在有两个同时作用的异常,这对c++而言太多了。 在两个异常同时存在的情况下,程序若不是结束执行就是导致不明确行为。本例中会导致不明确的行为。使用标准程序库的任何其他容器或TR1的任何容器或甚至array,也会出现相同情况。容器或array并非遇上麻烦的必要条件,只要析构函数吐出异常