zoukankan      html  css  js  c++  java
  • C++进阶--析构函数中的异常

    //############################################################################
    /*
     * 不要让异常离开析构函数
     * 析构函数中抛异常,会导致可能同时有多个异常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.
    " << 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的用户?
    */
    
  • 相关阅读:
    重温Thinking in java
    线程池
    apache DBUtils学习
    Mysql 建表 数据类型选择
    毫秒必争,前端网页性能最佳实践
    tomcat6 开启GZIP
    处理百万级以上的数据提高查询速度的方法
    Tomcat内存设置
    Tomcat全局Filter
    Tomcat多工程共享Session、ServletContext
  • 原文地址:https://www.cnblogs.com/logchen/p/10165255.html
Copyright © 2011-2022 走看看