Пространства имён
Варианты
Действия

std::uncaught_exception, std::uncaught_exceptions

Материал из cppreference.com
< cpp‎ | error
 
 
Библиотека диагностики
Обработка исключений
uncaught_exceptionuncaught_exceptions
(до C++20*)(C++17)
Сбои обработки исключений
(до C++17*)
(до C++17*)
(C++11)(до C++17*)    
(до C++17*)
Коды ошибок
Коды ошибок
Категории исключений
(ТС TM)
Поддержка системных ошибок
(C++11)
(C++11)
Утверждения
Трассировка стека
 
Определено в заголовочном файле <exception>
(1)
bool uncaught_exception()throw();
(до C++11)
bool uncaught_exception()noexcept;
(начиная с C++11)
(устарело в C++17)
(удалено в C++20)
int uncaught_exceptions()noexcept;
(2) (начиная с C++17)
1) Определяет, есть ли в текущем потоке активный объект исключения, т.е. исключение было сгенерировано или повторно сгенерировано и ещё управление не вошло в соответствующее предложение catch, std::terminate или std::unexpected. Другими словами, std::uncaught_exception определяет, выполняется ли в данный момент раскручивание стека.
2) Определяет, сколько исключений в текущем потоке было сгенерировано или повторно сгенерировано, и которые ещё не вошли в соответствующие им предложения catch.

Иногда генерировать исключение безопасно, даже если std::uncaught_exception()==true. Например, если раскручивание стека приводит к уничтожению объекта, деструктор для этого объекта может запускать код, который генерирует исключение, если исключение перехватывается каким-либо блоком catch перед выходом из деструктора.

Содержание

[править]Параметры

(нет)

[править]Возвращаемое значение

1)true, если в данный момент в этом потоке выполняется раскручивание стека, иначе false.
2) Количество неперехваченных объектов исключений в текущем потоке.

[править]Примечание

Примером, где используется возвращающая int uncaught_exceptions, является библиотека boost.log: выражение BOOST_LOG(logger)<< foo(); сначала создаёт защищающий объект и записывает количество неперехваченных исключений в своём конструкторе. Вывод выполняется деструктором защищающего объекта, если только foo() не генерирует исключение (в этом случае количество неперехваченных исключений в деструкторе больше, чем наблюдаемое конструктором).

std::experimental::scope_fail и std::experimental::scope_success в LFTS v3 полагаются на функциональность uncaught_exceptions, потому что их деструкторы должны делать разные действия, которые зависят от того, вызываются ли они во время раскручивания стека.

Макрос Тестирования функциональностиЗначениеСтандартФункциональность
__cpp_lib_uncaught_exceptions201411L(C++17)std::uncaught_exceptions

[править]Пример

#include <exception>#include <iostream>#include <stdexcept>   struct Foo {char id{'?'};int count = std::uncaught_exceptions();   ~Foo(){ count == std::uncaught_exceptions()?std::cout<< id <<".~Foo() вызван нормально\n":std::cout<< id <<".~Foo() вызван во время раскручивания стека\n";}};   int main(){ Foo f{'f'};   try{ Foo g{'g'};std::cout<<"Сгенерировано исключение\n";throwstd::runtime_error("тестовое исключение");}catch(conststd::exception& e){std::cout<<"Исключение поймано: "<< e.what()<<'\n';}}

Возможный вывод:

Сгенерировано исключение g.~Foo() вызван во время раскручивания стека Исключение поймано: тестовое исключение f.~Foo() вызван нормально

[править]Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
LWG 70 C++98 спецификация исключения uncaught_exception() отсутствовала указывается как throw()

[править]Смотрите также

функция, вызываемая при сбое обработки исключения
(функция)[править]
тип общего указателя для обработки объектов исключений
(определение типа)[править]
фиксирует текущее исключение в std::exception_ptr
(функция)[править]

[править]Внешние ссылки

1. Проблема GOTW 47: Неперехваченные Исключения
2. Обоснование std::uncaught_exceptions (N4125)
close