    Класс xailoc выводится из другого класса — xmsg, также объявленного в 
заголовочном файле EXCEPT.H.  Класс-предок содержит текстовое сообщение типа 
string (которое описывается далее в этой главе). Для доступа к этой строке, как 
показано в предыдущем фрагменте кода в операторе catch, следует использовать 
функцию-член why(). Для определения размера неудавшегося запроса выделения 
памяти в байтах следует использовать функцию x.requested(). 
    Вы также можете использовать один блок try в функции main() для обработки 
всех возникающих ошибок. Например, вашу функцию main() можно структурировать 
следующим образом:   

    void main()	
    {	.                            . 
       for (;;) {  
          try { 
            Run();	// Запустить программу 
         } 
          catch (xailoc x) { 
            cout « "Out of memory" « endl; 
            exit(-1);        // Завершить программу или выполнить другие действия 
         } 
     }
  }

    В этом примере идея заключается в вызове единственной функции Run(), 
запускающей программу. Любые исключительные ситуации будут обрабатываться в 
функции Run() (или в другой функции, которую вызывает Run()) либо в функции 
main(), где вы можете обработать их с помощью оператора catch. 
    В листинге 15.19 модифицированной версии программы MEMERR из главы 12, 
демонстрируется использование исключительных ситуаций вместе с оператором new 
для "изящной" обработки ошибок нехватки памяти. Вы можете скомпилировать и 
запустить эту программу как DOS- или Easy Win-приложение. 

    ПРЕДУПРЕЖДЕНИЕ 

    Поскольку в MEMERR выделяется вся доступная память, следует сохранить все 
документы и закрыть другие приложения до запуска программы на выполнение. Хоть 
это и маловероятно, однако MEMERR при выполнении может привести к краху DOS, 
Windows и администраторов памяти. (Я уже сталкивался с подобными 
неприятностям.) Это справедливо вдвойне, если вы модифицировали параметры 
программы. Будьте особенно осторожны при запуске этой программы. 


    Листинг 15.19. MEMERR.CPP (исключительные ситуации и оператор new) 

    1:	#include <iostream.h> 
    2:	#include <new.h> 
    3:	#include <except. h> 
    4:	#include <cstring.h> 
    5:	#include <stdlib.h>	
    6: 
    7:	struct q { 
    8:	  int ia[1024];	// 2048-байтовая структура 
    9:	}; 
    10: 
    11:	char *pool;	// Зарезервированный указатель пула памяти 
    12: 
    13: 	int main() 
    14:	{	
    15:	 struct q *qp;	// Указатель на структуру q 
    16: 
    17:	try {	
    18: 	   pool = new char[512]; 	// Зарезервировать немного памяти          
    19:	}
    20:	catch (xalloc) {	
    21:	  cout « "Not enough	RAM to run program" « endl;   
    22:	  exit(-1); 
    23:	} 
    24: 
    25:	for (;;) {	// Выполнять следующие операторы "до бесконечности" 
    26:	  try {	// Блок try для обработки исключительных ситуаций 
    27:	     qp = new q;	// Выделить новую структуру типа q 
    28:	      cout « qp « '\n	';// Отобразить адрес структуры 
    29:	  } 
    30:	 catch (xailoc x) {	// Обработать исключительную ситуацию из new  
    31:	   delete pool;	// Освободить память для следующей строки             
    32:	   cout « "Error: "	« x.why() « endl; // Вывести сообщение     
    33:	   exit(-1);	// Завершить программу (или другие действия) 


    418     Часть III. Программирование на ANSI C++ 
