    Вы можете заменить функции unexpected() и terminate() своим кодом для 
обработки необработанных исключительных ситуаций. Например, имеет смысл 
заменить функцию unexpected() для уведомления пользователя о любых 
необработанных исключительных ситуациях на этапе разработки программы. Это 
может помочь обнаружить недостающие обработчики ошибок в программе. В других 
случаях можно заменить terminate() диагностирующим кодом для просмотра памяти в 
надежде обнаружить операторы, повреждающие кучу, или для поиска причин 
возбуждения деструктором класса исключительной ситуации. 
    Заменить функцию abort() вы не можете. Вызов функции abort() всегда приводит 
к завершению программы без всяких "если", "но" или "потом как-нибудь". 

    Замена функций unexpected() и terminate() 

    Для задания адреса вашей собственной функции-обработчика непредвиденных 
исключительных ситуаций следует использовать функцию set_unexpected(), 
объявленную в заголовочном файле EXCEPT. H. Функция должна иметь тип 
unexpected_function, не иметь аргументов и ничего не возвращать. 
    Ваш обработчик непредвиденных исключительных ситуаций может возбуждать 
исключительную ситуацию, в этом случае поиски оператора catch начинаются с 
того места, откуда первоначально был вызван обработчик. 
    Для задания адреса вашей собственной функции-обработчика завершения 
программы следует использовать функцию set_terminate(), также объявленную в 
заголовочном файле ЕХСЕРТ.Н. Функция должна иметь тип terminate_function, не 
иметь параметров и ничего не возвращать. 
    Обе функции — set_unexpected() и set_terminate() — возвращают адрес 
текущей функции-обработчика. Вы можете сохранить и затем восстановить 
существующие обработчики, запомнив их адреса в переменных, а затем передав их 
обратно функциям. Например, сначала объявляется прототип функции-обработчика: 

    void unexpectedHandler(); 

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

    set_unexpected(unexpectedHandler); 

    Или же вы можете сохранить, а затем восстановить адрес прежней 
функции-обработчика, хотя это делать необязательно: 

    unexpected_function savedAdress;	// Объявить адресную переменную 
    savedAdress = set_unexpected(unexpectedHandler);	// Установить обработчик 
    // ... Новый обработчик перехватывает непредвиденные исключительные ситуации	-. 
    set_unexpected(savedAdress);    // Восстановить первоначальный обработчик 
    // ... Новый обработчик больше не используется 

    Пользовательская функция terminate() устанавливается аналогично, только 
вместо set_unexpected() вызывается функция set_terminate(), возвращающая адрес 
типа terminate_function. 
    В листинге 15.18 демонстрируется установка обработчиков непредвиденных 
исключительных ситуаций и завершения. В программе также демонстрируется 
приемлемый способ обработки непредвиденных исключительных ситуаций неизвестных 
типов, которые могут возбуждаться в плохо документированных библиотечных 
функциях. Вы можете скомпилировать и запустить следующую программу как DOS- 
или Easy Win-приложение. 

    Листинг 15.18.  UNEXPECT.CPP (установка функций-обработчиков unexpected() и terminate()) 

    1:	#include <iostrearo. h> 
    2:	#include <except.h> 
    3: 
    4:	#define MAXERR 10 
    5: 
    6:	// Класс, используемый, когда число ошибок превышает допустимое 
    7:	class HaxError 
    8:	{ 
    9:	);
    10: 
    11:	// Обычный класс исключительных ситуаций 
    12:	class Error {      
    13:	public:      
    14:	  Error();    //Конструктор 
    15:	  void Say();  // Функция, сообщающая о числе ошибок 
    16:	private: 
    17:	  static int count; // Доступен только в этом классе /      ' 
    18:	}; 
    19:	
    20:	// Прототипы функций, возбуждающих исключительные ситуацищ..; , 
    21:	void Run() throw(Error);                        
    22:	void trapper(); 


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