//############################################################################
/*
 * 不要让异常离开析构函数
 * 析构函数中抛异常,会导致可能同时有多个异常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的用户?
*/

相关文章:

  • 2021-09-30
  • 2021-06-03
  • 2022-12-23
  • 2021-08-16
  • 2022-12-23
  • 2022-12-23
  • 2021-12-07
  • 2022-01-12
猜你喜欢
  • 2021-10-31
  • 2022-12-23
  • 2022-02-06
  • 2021-08-27
  • 2021-08-22
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案