std:: uncaught_exception, std:: uncaught_exceptions
|
Défini dans l'en-tête
<exception>
|
||
| (1) | ||
|
bool
uncaught_exception
(
)
throw
(
)
;
|
(jusqu'à C++11) | |
|
bool
uncaught_exception
(
)
noexcept
;
|
(depuis C++11)
(obsolète 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 pile
est actuellement en cours.
Il est parfois sûr de lancer une exception même lorsque std :: uncaught_exception ( ) == true (jusqu'en C++17) std :: uncaught_exceptions ( ) > 0 (depuis C++17) . Par exemple, si le déroulement de pile provoque la destruction d'un objet, le destructeur de cet objet peut exécuter du code qui lance une exception tant que cette exception est capturée par un bloc catch avant de s'échapper du destructeur.
Table des matières |
Paramètres
(aucun)
Valeur de retour
Notes
Un exemple où
uncaught_exceptions
retournant un int est utilisé est la bibliothèque
boost.log
: l'expression
BOOST_LOG
(
logger
)
<<
foo
(
)
;
crée d'abord un objet garde et enregistre le nombre d'exceptions non capturées dans son constructeur. La sortie est effectuée par le destructeur de l'objet garde sauf si
foo
(
)
lève une exception (auquel cas le nombre d'exceptions non capturées dans le destructeur est supérieur à ce que le constructeur a observé).
std::experimental::scope_fail
et
std::experimental::scope_success
dans LFTS v3 reposent sur la fonctionnalité de
uncaught_exceptions
, car leurs destructeurs doivent effectuer des opérations différentes selon qu'ils sont appelés durant le déroulement de pile.
| Macro de test de fonctionnalité | Valeur | Std | 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 modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | S'applique à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 70 | C++98 |
la spécification d'exception de
uncaught_exception()
était manquante
|
spécifiée comme
throw()
|
Voir aussi
|
fonction appelée lorsque la gestion des exceptions échoue
(fonction) |
|
|
(C++11)
|
type de pointeur partagé pour manipuler les objets d'exception
(typedef) |
|
(C++11)
|
capture l'exception courante dans un
std::exception_ptr
(fonction) |
Liens externes
| 1. | GOTW numéro 47 : Exceptions non capturées |
| 2. |
Justification de
std::uncaught_exceptions
(N4125)
|