Бьерн Страуструп - Язык программирования С++. Главы 9-10
Страница 17. Неперехваченные особые ситуации



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

 
« Предыдущая статья   Следующая статья »