NO.7:别让异常逃离析构函数
1.析构函数绝对不要吐出异常,如果一个析构函数可能抛出异常,析构函数应该捕获任何异常,然后要么吞下它们或者退出程序
2.如果用户需要对析构内的可能抛出异常的操作做出反应,则应该将操作放入除析构函数外的普通函数中
1 #include <iostream> 2 3 4 class SQLConnect 5 { 6 public: 7 static SQLConnect &creat() 8 { 9 static SQLConnect obj; 10 return obj; 11 } 12 13 //... 14 //... 15 void close() 16 { 17 //用户处理 18 try 19 { 20 std::cout << "disconnect" << std::endl; 21 22 }catch(...) 23 { 24 25 } 26 27 } 28 29 }; 30 31 32 //管理SQLConnect 33 class abnormal 34 { 35 private: 36 SQLConnect &obj_; 37 bool closed_; 38 public: 39 abnormal(SQLConnect &obj) : obj_(obj), closed_(false) 40 { 41 42 } 43 44 45 //最好定义一个外部close函数,给予用户处理异常的机会 46 void ab_close() 47 { 48 //如果这里出现异常,SQLConnect会做处理 49 obj_.close(); 50 closed_ = true; 51 52 } 53 54 ~abnormal() 55 { 56 try 57 { 58 if(!closed_) 59 obj_.close(); 60 61 } catch (...) 62 { 63 //做一些信息处理,异常信息 64 65 //方式1,直接结束程序,防止出现 "不明确定义" 行为 66 std::abort(); 67 68 //方式2,只做一些信息处理,不做任何退出程序(退下异常) 69 70 } 71 72 73 } 74 75 76 }; 77 78 79 int main(int argc, char **argv) 80 { 81 abnormal obj(SQLConnect::creat()); 82 return 0; 83 }