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) |
std::terminate или std::unexpected. Другими словами, std::uncaught_exception определяет, происходит ли в данный момент разворачивание стека.Иногда безопасно возбуждать исключение даже во время std::uncaught_exception() == true. Например, если разворачивание стека приводит к уничтожению объекта, деструктор этого объекта может выполнить код, возбуждающий исключение, при условии, что исключение будет перехвачено каким-либо оператором catch перед выходом из деструктора.
Параметры
(нет)
Возвращаемое значение
true если в этом потоке в данный момент происходит разворачивание стека, false в противном случае.Примечания
Пример использования 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() |
См. также
| функция, вызываемая при ошибке обработки исключений (функция) |
|
|
(C++11) |
тип shared pointer для обработки объектов исключений (typedef) |
|
(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