Рубрики

Настройка поведения завершения для необработанного исключения в C ++

Всякий раз, когда в C ++ возникает исключение, оно обрабатывается в соответствии с поведением, определенным с использованием блока try-catch. Однако часто возникает ситуация, когда исключение выдается, но не перехватывается, поскольку подсистеме обработки исключений не удается найти соответствующий блок перехвата для этого конкретного исключения. В этом случае происходит следующий набор действий:

  1. Подсистема обработки исключений вызывает функцию: непредвиденный () . Эта функция, предоставляемая библиотекой C ++ по умолчанию, определяет поведение при возникновении неперехваченного исключения. По умолчанию неожиданные вызовы прекращаются () .
  2. Функция завершения определяет действия, которые должны быть выполнены во время завершения процесса. Это, по умолчанию, вызывает abort () .
  3. Процесс прерван.

Terminate () и непредвиденный () просто вызывают другие функции для фактической обработки ошибки. Как объяснено выше, завершать вызовы abort () и неожиданные () вызовы terminate (). Таким образом, обе функции останавливают выполнение программы при возникновении ошибки обработки исключений. Тем не менее, вы можете изменить способ завершения.

Чтобы изменить обработчик завершения, используется функция set_terminate (terminate_handler newhandler), которая определена в заголовке <исключение> .

Следующая программа демонстрирует, как установить пользовательский обработчик завершения:

// Программа CPP для установки нового обработчика завершения
// для неисследованных исключений.
#include <exception>
#include <iostream>

using namespace std;

  
// определение пользовательской функции завершения

void myhandler()

{

    cout << "Inside new terminate handler\n";

    abort();

}

  

int main()

{

    // устанавливаем новый обработчик завершения

    set_terminate(myhandler); 

    try {

        cout << "Inside try block\n";

        throw 100;

    }

    catch (char a) // не поймает исключение int

    {

        cout << "Inside catch block\n";

    }

    return 0;

}

Выход:

Inside try block
Inside new terminate handler


Ошибка выполнения:

Abort signal from abort(3) (SIGABRT)

Следует должным образом отметить, что единственное, что должен сделать пользовательский обработчик завершения, — остановить выполнение программы. Он не должен возвращаться в программу или возобновлять ее каким-либо образом.

Рекомендуемые посты:

Настройка поведения завершения для необработанного исключения в C ++

0.00 (0%) 0 votes