Шаг 11.
Функции обработки неопознанного исключения: terminate() и set_terminate()

    На этом шаге мы рассмотрим назначение и возможности функций terminate() и set_terminate().

    Функция void terminate() вызывается в случае, когда отсутствует процедура для обработки некоторого сформированного исключения. По умолчанию terminate() вызывает библиотечную функцию abort(), что влечет выдачу сообщения "Abnormal program termination" и завершение программы. Если такая последовательность действий программиста не устраивает, он может написать собственную функцию (terminate_function) и зарегистрировать ее с помощью функции set_terminate(). В этом случае terminate() будет вызывать эту новую функцию вместо функции abort().

    Функция set_terminate() позволяет установить функцию, определяющую реакцию программы на исключение, для обработки которого нет специальной процедуры. Эти действия определяются в функции, поименованной ниже как terminate_func(). Указанная функция специфицируется как функция типа terminate_function. Такой тип в свою очередь определен в файле except.h как указатель на функцию без параметров, не возвращающую значения:

    typedef void   (*terminate_function)();
    terminate_function  set_terminate(terminate_function terminate_func);

    Функция set_tenninate() возвращает указатель на функцию, которая была установлена с помощью set_terminate() ранее.

    Следующая программа демонстрирует общую схему применения собственной функции для обработки неопознанного исключения:

//EXC11_1.СРР  - замена стандартной функции terminate().
#include <stdlib.h>    // Для функции abort().
#include  <except.h>   // Для  функции поддержки исключений.
#include <iostream.h>  // Для потоков ввода-вывода.
// Указатель на предыдущую функцию terminate:
void   (*old_terminate)();
// Новая функция обработки неопознанного исключения:
void new_terminate()
{
  cout << "\nВызвана функция new_terminate()";
  // ... Действия, которые необходимо выполнить 
  // ... до завершения программы.
  abort();  // Завершение программы.
}
void main() 
{ 
  // Установка своей функции обработки:
  old_terminate = set_terminate(new_terminate);
  // Генерация исключения вне контролируемого блока:
  throw(25) ;
}
Текст этой программы можно взять здесь.

    Результат выполнения программы:


Рис.1. Результат работы приложения

    Перечислим требования к создаваемой программистом функции для обработки неопознанного исключения:

    На следующем шаге мы рассмотрим функции unexpected() и set_unexpected().




Предыдущий шаг Содержание Следующий шаг