На этом шаге мы рассмотрим назначение и возможности функций 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().