Namespaces
Variants

std:: uncaught_exception, std:: uncaught_exceptions

From cppreference.net
Определено в заголовке <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)
(constexpr начиная с C++26)
1) Определяет, имеется ли в текущем потоке активный объект исключения, то есть было ли исключение выброшено или перевыброшено и еще не вошло в соответствующий блок catch, std::terminate или std::unexpected . Другими словами, std::uncaught_exception определяет, выполняется ли в данный момент раскрутка стека .
2) Определяет, сколько исключений в текущем потоке было выброшено или перевыброшено и еще не вошли в соответствующие блоки catch.

Иногда безопасно выбрасывать исключение, даже когда std :: uncaught_exception ( ) == true (до C++17) std :: uncaught_exceptions ( ) > 0 (начиная с C++17) . Например, если раскрутка стека приводит к уничтожению объекта, деструктор этого объекта может выполнить код, который выбрасывает исключение, при условии что исключение будет перехвачено каким-либо блоком 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
__cpp_lib_constexpr_exceptions 202411L (C++26) constexpr для типов исключений

Пример

#include <exception>
#include <iostream>
#include <stdexcept>
struct Foo
{
    char id{'?'};
    int count = std::uncaught_exceptions();
    ~Foo()
    {
        count == std::uncaught_exceptions()
            ? std::cout << id << ".~Foo() called normally\n"
            : std::cout << id << ".~Foo() called during stack unwinding\n";
    }
};
int main()
{
    Foo f{'f'};
    try
    {
        Foo g{'g'};
        std::cout << "Exception thrown\n";
        throw std::runtime_error("test exception");
    }
    catch (const std::exception& e)
    {
        std::cout << "Exception caught: " << e.what() << '\n';
    }
}

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

Exception thrown
g.~Foo() called during stack unwinding
Exception caught: test exception
f.~Foo() called normally

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

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

Смотрите также

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

Внешние ссылки

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