Байланысты: Бьерн Страуструп. Язык программирования С . М Бином, 2011
9.7 Неперехваченные особые ситуации Если особая ситуация запущена и не перехвачена, то вызывается функция terminate(). Она же
вызывается, когда система поддержки особых ситуаций обнаруживает, что структура стека нарушена,
или когда в процессе обработки особой ситуации при раскручивании стека вызывается деструктор, и он
пытается завершить свою работу, запустив особую ситуацию.
Действие terminate() сводится к выполнению самой последней функции, заданной как параметр для
set_terminate():
typedef void (*PFV)();
PFV set_terminate(PFV);
Функция set_terminate() возвращает указатель на ту функцию, которая была задана как параметр в
предыдущем обращении к ней.
Необходимость такой функции как terminate() объясняется тем, что иногда вместо механизма особых
ситуаций требуются более грубые приемы. Например, terminate() можно использовать для прекращения
процесса, а, возможно, и для повторного запуска системы. Эта функция служит экстренным средством,
которое применяется, когда отказала стратегия обработки ошибок, рассчитанная на особые ситуации, и
самое время применить стратегию более низкого уровня.
Функция unexpected() используется в сходных, но не столь серьезных случаях, а именно, когда функция
запустила особую ситуацию, не указанную в ее описании. Действие функции unexpected() сводится к
выполнению самой последней функции, заданной как параметр для функции set_unexpected().
По умолчанию unexpected() вызывает terminate(), а та, в свою очередь, вызывает функцию abort().
Предполагается, что такое соглашение устроит большинство пользователей.
Предполагается, что функция terminate() не возвращается в обратившеюся ней функцию.
Напомним, что вызов abort() свидетельствует о ненормальном завершении программы. Для
нормального выхода из программы используется функция exit(). Она возвращает значение, которое
показывает окружающей системе насколько корректно закончилась программа.