|
|
Если особая ситуация запущена и не перехвачена, то вызывается функция
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(). Она возвращает значение, которое
показывает окружающей системе насколько корректно закончилась программа.
| |