C++箴言:防止异常离开析构函数
C++并不禁止从析构函数抛出异常,但确实阻碍了实践。至于任何好的理由,请考虑:
类小部件{
公共:
...
~Widget() {...} //假设这可能会发出异常
};
void doSomething()
{
STD::vector v;
...
} // v在这里自动销毁
当vector v被析构时,它负责销毁它包含的所有小部件。假设v中有十个小部件,销毁第一个时抛出异常。其他9个小部件仍然必须被销毁(否则它们持有的任何资源都会被泄漏),所以V应该调用它们的析构函数。但是假设在这个调用中,第二个小部件的析构函数抛出了另一个异常。现在同时有两个异常活动,这对于C++来说太多了。当这两个同时发生的异常在非常巧合的条件下发生时,程序的执行将终止或导致未定义的行为。在本例中,将引发未定义的行为。同样,使用任何标准库容器(例如list、set),TR1中的任何容器,甚至数组,都可能导致未定义的问题。你不一定要成为一个容器或者一个数组才会有麻烦。程序的死的或未定义的行为是析构函数抛出异常的结果,即使没有使用容器或数组。++C不喜欢抛出异常的析构函数。这很容易理解,但是如果你的析构函数需要执行一个可能失败并抛出异常的操作呢?例如,假设您使用一个数据库连接类:
类数据库连接{
公共:
...
静态db connection create();//要返回的函数
// DBConnection对象;参数
//为简单起见省略
void close();//关闭连接;扔一个
};//关闭失败异常
位律师回复
0条评论