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

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_exceptions 201411L (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";
        throw std::runtime_error("тестовое исключение");
    }
    catch (const std::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)