Функция terminate
Функция terminate вызывается в том случае, когда
из программы выбрасывается исключение, которое не было
перехвачено ни одним обработчиком catch. По умолчанию
она вызывает функцию abort, что приводит к немедленному
аварийному завершению программы без вызова деструкторов
локальных объектов и без очистки ресурсов. Функция не
принимает параметров и не возвращает значения.
Поведение terminate можно изменить, установив
собственный обработчик с помощью функции set_terminate.
Пользовательский обработчик не должен возвращать управление
обратно в программу - если он всё же вернётся, поведение
не определено.
Синтаксис
void terminate();
Пример
Давайте посмотрим, что произойдёт, если выбросить
исключение и не перехватить его. Программа аварийно
завершится вызовом terminate:
#include <iostream>
#include <exception>
using namespace std;
int main()
{
cout << "Start" << endl;
throw runtime_error("error");
cout << "This line will not be printed" << endl;
return 0;
}
Результат выполнения кода:
"Start"
"terminate called after throwing an instance of 'std::runtime_error'"
"what(): error"
Пример
Давайте установим собственный обработчик через
set_terminate, который выведет сообщение перед
завершением программы:
#include <iostream>
#include <exception>
using namespace std;
void myHandler()
{
cout << "Custom terminate handler" << endl;
abort();
}
int main()
{
set_terminate(myHandler);
cout << "Start" << endl;
throw runtime_error("error");
return 0;
}
Результат выполнения кода:
"Start"
"Custom terminate handler"
Пример
Давайте убедимся, что при выбросе исключения внутри
деструктора во время раскрутки стека также вызывается
terminate:
#include <iostream>
#include <exception>
using namespace std;
struct A
{
~A()
{
throw runtime_error("from destructor");
}
};
int main()
{
try
{
A a;
throw runtime_error("main error");
}
catch (const exception& e)
{
cout << e.what() << endl;
}
return 0;
}
Результат выполнения кода:
terminate called during stack unwinding