条款8:不能让异常逃离析构函数,否则难以想象
2017-03-14 17:14
666 查看
1、c++并不禁止析构函数吐出异常,但它不鼓励你这样做。
例:vector存的结构是class的话,当vector被销毁时,如果两个class在析构的时候抛出异常,程序若不是结束执行就是导致不明确行为。
2、如果析构函数必须执行一个动作,该动作可能会失败抛出异常,该怎么办?
(1)如果抛出异常,通过调用abort直接结束程序;
try {
db.close(); //失败了可能抛出异常
}
catch ( ){
//记录;
std::abort();
}
(2)吞下发生的异常。
try {
db.close(); //失败了可能抛出异常
}
catch ( ){
//记录;
}
(2
3、如果需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作。
class DBConn{
public:
void close(){
db.close();
closed = true;
}
~DBConn(){
if(!closed){
try {
db.close();
}
catch (){
//记录,并结束程序或者吞下异常;
}
}
}
private :
BDConection db;
bool closed;
};
例:vector存的结构是class的话,当vector被销毁时,如果两个class在析构的时候抛出异常,程序若不是结束执行就是导致不明确行为。
2、如果析构函数必须执行一个动作,该动作可能会失败抛出异常,该怎么办?
(1)如果抛出异常,通过调用abort直接结束程序;
try {
db.close(); //失败了可能抛出异常
}
catch ( ){
//记录;
std::abort();
}
(2)吞下发生的异常。
try {
db.close(); //失败了可能抛出异常
}
catch ( ){
//记录;
}
(2
3、如果需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作。
class DBConn{
public:
void close(){
db.close();
closed = true;
}
~DBConn(){
if(!closed){
try {
db.close();
}
catch (){
//记录,并结束程序或者吞下异常;
}
}
}
private :
BDConection db;
bool closed;
};
相关文章推荐
- Effective C++ 条款08:别让异常逃离析构函数
- Effective C++ 条款08:别让异常逃离析构函数
- 读书笔记_Effective_C++_条款八:别让异常逃离析构函数
- Effective C++ 条款八 别让异常逃离析构函数
- Effective C++:条款08:别让异常逃离析构函数!
- Effective c++学习笔记——条款08:别让异常逃离析构函数
- 条款八 别让异常逃离析构函数
- 条款08:别让异常逃离析构函数(Prevent exceptions from leaving destructors.)
- 条款08:别让异常逃离析构函数
- 读书笔记《Effective C++》条款08:别让异常逃离析构函数
- 条款08:别让异常逃离析构函数
- 《Effective C++》——条款08:别让异常逃离析构函数
- 条款08:别让异常逃离析构函数
- 《Effective C++》学习笔记条款08 别让异常逃离析构函数
- effective c++条款08别让异常逃离析构函数
- 条款8:别让异常逃离析构函数(prevent exception from leaving destructors)
- 条款08:别让异常逃离析构函数
- Effective C++——》 条款08:别让异常逃离析构函数
- effective C++ 条款 8:别让异常逃离析构函数
- 条款08:别让异常逃离析构函数