1.析构函数绝对不要吐出异常,如果一个析构函数可能抛出异常,析构函数应该捕获任何异常,然后要么吞下它们或者退出程序
2.如果用户需要对析构内的可能抛出异常的操作做出反应,则应该将操作放入除析构函数外的普通函数中
1 #include2 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 try19 {20 std::cout << "disconnect" << std::endl;21 22 }catch(...)23 {24 25 }26 27 }28 29 };30 31 32 //管理SQLConnect33 class abnormal34 {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 try57 {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 }