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)
(constexpr начиная с C++26) |
std::uncaught_exception
определяет, выполняется ли в данный момент
раскрутка стека
.
Иногда безопасно выбрасывать исключение, даже когда std :: uncaught_exception ( ) == true (до C++17) std :: uncaught_exceptions ( ) > 0 (начиная с C++17) . Например, если раскрутка стека приводит к уничтожению объекта, деструктор этого объекта может выполнить код, который выбрасывает исключение, при условии что исключение будет перехвачено каким-либо блоком catch до выхода из деструктора.
Содержание |
Параметры
(нет)
Возвращаемое значение
Примечания
Пример, где используется возвращающий 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()
|
Смотрите также
|
функция, вызываемая при неудачной обработке исключений
(функция) |
|
|
(C++11)
|
тип умного указателя для обработки объектов исключений
(typedef) |
|
(C++11)
|
захватывает текущее исключение в
std::exception_ptr
(функция) |
Внешние ссылки
| 1. | GOTW выпуск 47: Неперехваченные исключения |
| 2. |
Обоснование для
std::uncaught_exceptions
(N4125)
|