    Если конструктор объекта b возбуждает исключительную ситуацию, объект с не 
создается, как и объект класса AnyCIass. Деструктор объекта а вызывается как 
обычно (поскольку он был полностью создан до того, как b возбудил 
исключительную ситуацию), но деструкторы для объектов Ь, с и AnyCIass не вызываются. 

    Возбуждение исключительных ситуаций 

    Класс может также возбудить исключительную ситуацию своего же типа. Обычно 
это делается с помощью функции-члена, которую часто называют Raise(). Например, 
вы можете создать класс исключительной ситуации следующим образом: 

    Class Error { 
       void Raise()
	{ throw Error();  }  
    }; 

    Если е — объект класса Error, оператор 

    e.Raise();	// Возбудить исключительную ситуацию класса Error 

возбуждает исключительную ситуацию, посылая еще один объект этого же 
класса. В зависимости от сервиса, предоставляемого классом Error, создание 
нового объекта исключительной ситуации может лучше удовлетворить ваши запросы, 
чем повторное возбуждение следующей исключительной ситуации с уже существующим объектом: 

    throw е;	// Возбуждение исключительной ситуации с суцествующин объектом 


    Исключительные ситуации и управление распределением памяти 

    Как упоминалось ранее, оператор new возбуждает исключительную ситуацию, 
если не может удовлетворить запрос выделения памяти, в отличие от более ранних 
версий C++, в которых возвращался null (нуль) в случае нехватки памяти. 

    ЗАМЕЧАНИЕ 

    Если вы хотите чтобы new действоввал no-старому, возвращая нуль в случае возникновения 
ошибок, включите в программу заголовочный файл  NEW.H и добавьте в функцию main()
следующий оператор:

     set_new_handler(0) ;

    Раньше вы, вероятно, написали бы следующий код: 

    AnyCIass *p;		// Объявить указатель на AnyCIass 
    р = new AnyClass();	// Создать объект типа AnyCIass, адресуемый р 
    if (р == 0} Error();		// Вызвать процедуру, если не хватает памяти 

    Если после использования оператора new для выделения памяти объекту класса 
AnyCIass указатель р содержит нуль, это значит, что new не удалось выделить 
достаточно памяти для создания объекта. Сложность в том, что необходимо 
выполнять проверку возвращаемого значения new после каждого использования оператора. 
    Исключительные ситуации предлагают иной способ использования new. Теперь 
при нехватке памяти оператop new возбуждает исключительную ситуацию типа 
xalloc, определенного в заголовочном файле EХСЕРТ.Н следующим образом: 

    class xalloc : public xmsg { 
    public: 
        xalloc(const string &msg, size_t size), 
       size_t requested() const; 
       void raise() throw(xalloc); 
   private: 
      size_t siz; 
   }; 

    Для использования исключительных ситуаций вместе с new заключите 
операторы, выделяющие память, в try, за которым должен следовать оператор 
catch для объекта класса xalloc. Например, вы можете написать следующее: 

    try { 
      р = new AnyClass(); 
      // ... прочие операторы, выделяющие память 
    }
    catch (xalloc х) { 
      cout « "Memory error:  « x.why() « endl; 
      exit(-1);    
    }


    15. Передовые средства C++ Borland® C++4.5     417 
