std::uncaught_exception, std::uncaught_exceptions
| Défini dans l'en-tête <exception>
|
||
bool uncaught_exception() throw();
|
(1) | (jusqu'à C++11) |
bool uncaught_exception() noexcept;
|
(depuis C++11) (déprécié en C++17) (supprimé en C++20) |
|
int uncaught_exceptions() noexcept;
|
(2) | (depuis C++17) (constexpr depuis C++26) |
std::uncaught_exception détecte si le déroulement de la pile est actuellement en cours.Il est parfois sûr de lever une exception même pendant que std::uncaught_exception() == true(jusqu'à C++17) std::uncaught_exceptions() > 0(depuis C++17). Par exemple, si le déroulement de la pile provoque la destruction d'un objet, le destructeur de cet objet pourrait exécuter du code qui lève une exception tant que cette exception est attrapée par un bloc catch avant de quitter le destructeur.
Valeur de retour
true si le déroulement de la pile est actuellement en cours dans ce fil d'exécution, false sinon.Notes
Un exemple où uncaught_exceptions à retour int est utilisé est la bibliothèque boost.log : l'expression BOOST_LOG(logger) << foo(); crée d'abord un objet de garde et enregistre le nombre d'exceptions non attrapées dans son constructeur. La sortie est effectuée par le destructeur de l'objet de garde sauf si foo() lève une exception (auquel cas le nombre d'exceptions non attrapées dans le destructeur est supérieur à celui observé par le constructeur).
std::experimental::scope_fail et std::experimental::scope_success dans LFTS v3 reposent sur la fonctionnalité de uncaught_exceptions, car leurs destructeurs doivent faire des choses différentes selon que l'appel a lieu pendant le déroulement de la pile.
| Macro de test de fonctionnalité | Valeur | Norme | Fonctionnalité |
|---|---|---|---|
__cpp_lib_uncaught_exceptions |
201411L |
(C++17) | std::uncaught_exceptions
|
__cpp_lib_constexpr_exceptions |
202411L |
(C++26) | constexpr pour les types d'exception
|
Exemple
#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';
}
}
Sortie possible :
Exception thrown
g.~Foo() called during stack unwinding
Exception caught: test exception
f.~Foo() called normally
Rapports de défauts
Les rapports de défauts suivants, modifiant le comportement, ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement tel que publié | Comportement correct |
|---|---|---|---|
| LWG 70 | C++98 | la spécification d'exception de uncaught_exception() était manquante
|
spécifiée comme throw()
|
Voir aussi
| fonction appelée en cas d'échec de la gestion des exceptions (fonction) | |
(C++11) |
type pointeur partagé pour la manipulation des objets exception (typedef) |
(C++11) |
capture l'exception en cours dans un std::exception_ptr (fonction) |
Liens externes
| 1. | Numéro GOTW 47 : Exceptions non attrapées |
| 2. | Justification de std::uncaught_exceptions (N4125)
|