Функция std::terminate() используется механизмом обработки исключений для устранения ошибок, связанных с самим механизмом обработки исключений. Функция std::current_exception() и класс std::nested_exception могут использоваться программой для захвата текущего обрабатываемого исключения.
В некоторых ситуациях необходимо отказаться от обработки исключений в пользу менее тонких методов обработки ошибок. [ Note: Эти ситуации:
когда механизм обработки исключений после завершения инициализации объекта исключения, но до активации обработчика исключения ([except.throw]), вызывает функцию, которая завершается через исключение, или
когда механизм обработки исключений не может найти обработчик для брошенного исключения ([except.handle]), или
когда поиск handler встречает самый внешний блок функции с не-бросанием exception specification, или
когда разрушение объекта во время stack unwinding завершается выдачей исключения, или
когда инициализация нелокальной переменной со статической или поточной продолжительностью хранения ([basic.start.dynamic]) завершается через исключение, или
когда уничтожение объекта со статической продолжительностью хранения или продолжительностью хранения потока завершается через exception ([basic.start.term]), или
когда выполнение функции регистрируется std::atexit или std::at_quick_exit выходят через исключение ([support.start.term]), или
когда a throw-expression без операнда пытается повторно вызвать исключение и исключение не обрабатывается ([except.throw]), или
когда функция std::nested_exception::rethrow_nested вызывается для объекта, который не зафиксировал исключение ([except.nested]), или
когда выполнение начальной функции потока завершается через исключение ([thread.thread.constr]), или
для параллельного алгоритма которого ExecutionPolicy задает поведение (например[execpol.seq], [execpol.par], [execpol.parunseq]), когда выполнение функции доступа к элементу ([algorithms.parallel.defns]) из параллельных выходов алгоритма с помощью исключения ([algorithms.parallel.exceptions]), или
когда деструктор или оператор присваивания копии вызывается для объекта типа, std::thread который ссылается на присоединяемый поток ([thread.thread.destr], [thread.thread.assign]), или
когда вызов к wait(), wait_until()или wait_for() функции на условном переменном ([thread.condition.condvar], [thread.condition.condvarany]) не соответствует постусловиям.
— end note ]
В таких случаях std::terminate() is called. В ситуации, когда соответствующий обработчик не найден, определяется реализацией, будет ли стек разматан перед вызовом std::terminate() . В ситуации, когда поиск handler встречает самый внешний блок функции с невыбрасыванием exception specification, определяется реализацией, разматывается ли стек, частично разматывается или не разматывается вообще перед std::terminate() вызовом. Во всех других ситуациях стек не должен разворачиваться до вызова std::terminate() . Реализации не разрешается преждевременно завершать раскручивание стека на основании определения того, что процесс раскрутки в конечном итоге вызовет вызов std::terminate().
Исключение считается неперехваченным после завершения инициализации exception object до завершения активации обработчика исключения ([except.handle]). Это включает разматывание стека. Если исключение генерируется повторно ([expr.throw], [propagation]), оно считается неперехваченным с момента повторного генерирования, пока не будет перехвачено повторно созданное исключение. Функция std::uncaught_exceptions() возвращает количество неперехваченных исключений в текущем потоке.