Spec-Zone.ru › C++

std::uncaught_exception, std::uncaught_exceptions

Определено в заголовке <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) Количество объектов неперехваченных исключений в текущем потоке.

Примечания

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

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

Макрос проверки наличия функции Значение Std Функция
__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() 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()

См. также

terminate
функция, вызываемая при ошибке обработки исключений
(функция)
exception_ptr
(C++11)
тип shared pointer для обработки объектов исключений
(typedef)
current_exception
(C++11)
перехватывает текущее исключение в std::exception_ptr
(функция)

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

1. GOTW issue 47: Uncaught Exceptions
2. Обоснование для std::uncaught_exceptions (N4125)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/error/uncaught_exception

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API