18 Exception handling [except]

18.5 Special functions [except.special]

Функция std​::​terminate() используется механизмом обработки исключений для устранения ошибок, связанных с самим механизмом обработки исключений. Функция std​::​current_­exception() и класс std​::​nested_­exception могут использоваться программой для захвата текущего обрабатываемого исключения.

18.5.1 The std​::​terminate() function [except.terminate]

В некоторых ситуациях необходимо отказаться от обработки исключений в пользу менее тонких методов обработки ошибок. [ 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().

18.5.2 The std​::​uncaught_­exceptions() function [except.uncaught]

Исключение считается неперехваченным после завершения инициализации exception object до завершения активации обработчика исключения ([except.handle]). Это включает разматывание стека. Если исключение генерируется повторно ([expr.throw], [propagation]), оно считается неперехваченным с момента повторного генерирования, пока не будет перехвачено повторно созданное исключение. Функция std​::​uncaught_­exceptions() возвращает количество неперехваченных исключений в текущем потоке.