《Effective C++ 中文版 第三版》讀書筆記
** 條款 08:別讓異常逃離析構(gòu)函數(shù) **
如果拋出異常就結(jié)束程序。通常通過調(diào)用 abort 完成:
Toby::~Toby(){
try{t.Close();}
catch(...){
//< 記錄日志
std::abort();
}
}
吞下因調(diào)用某函數(shù)而發(fā)生的異常:
Toby::~Toby(){
try{t.Close();}
catch(...){
//< 記錄日志
}
}
最佳方式:
class Toby{
public:
...
void close(){
t.Close();
bClosed = true;
}
~Toby(){
if(!bClosed){
try{t.Close();}
catch(...){
//< 記錄日志
...
}
}
}
private:
SomeClass t;
bool bClosed;
};
** 請記拙住:**
- 析構(gòu)函數(shù)絕對不要吐出異常。如果一個(gè)被析構(gòu)函數(shù)調(diào)用的函數(shù)可能拋出異常氮发,析構(gòu)函數(shù)應(yīng)該捕獲任何異常,然后吞下它們(不傳播)或結(jié)束程序。
- 如果客戶需要對某個(gè)操作函數(shù)運(yùn)行期間拋出的異常做出反應(yīng),那么 class 應(yīng)該提供一個(gè)普通函數(shù)(而非在析構(gòu)函數(shù)中)執(zhí)行該操作侈沪。