NO.7:别让异常逃离析构函数

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 }