Функции обработки неопознанного исключения: 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. Результат работы приложения

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

  • она не должна формировать новых исключений,
  • эта функция должна завершать программу и не возвращать управление вызвавшей ее функции terminate().
    Попытка такого возврата приведет к неопределенным результатам.

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий