猫猫哥

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
//############################################################################
/*
 * 不要让异常离开析构函数
 * 析构函数中抛异常,会导致可能同时有多个异常pending
 * 因为一旦出现异常,栈回退的过程中会析构函数。如果析构函数又抛出异常,就会有多个异常pending
 */

class dog {
	public:
	string m_name;
	dog(string name) {m_name = name; cout << name << " is born." << endl; }
	~dog() { cout<< m_name << " is distroied.\n" << endl; }
   void prepareToDestr() {...; throw 20; }
   void bark() {...}
	...
};

int main{} {
  try {
     dog dog1("Henry");
     dog dog2("Bob");
     dog1.bark(); 
     dog2.bark();
     dog1.prepareToDestr();
     dog2.prepareToDestr();
  } catch (int e) {
	  cout << e << " is caught" << endl;
  }
}

OUTPUT:
Henry is born.
Bob is born.
Bob is distroied.
Henry is distroied.
20 is caught

/*
 * 解决方法1: 在析构函数内部catch异常,家丑不外扬。
 */
	~dog() { 
      try {
         // Enclose all the exception prone code here
      } catch (MYEXCEPTION e) {
         // Catch exception
      } catch (...) {
      }
   }


/* 
 * 解决方法2: 将容易出异常的代码移到其他函数中,甩锅大法好。如前面例子中的prepareToDestr函数
 */

/*
两者如何选择?

取决于谁更适合来处理异常,是dog类本身,还是dog的用户?
*/
posted on 2018-12-23 19:21  猫猫哥  阅读(921)  评论(0编辑  收藏  举报