Namespaces
Variants

std::uncaught_exception, std::uncaught_exceptions

Depuis fr.cppreference.net
 
 
 
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)
1) Détecte si le fil d'exécution actuel possède un objet exception vivant, c'est-à-dire qu'une exception a été levée ou relancée et n'est pas encore entrée dans une clause catch correspondante, std::terminate ou std::unexpected. En d'autres termes, std::uncaught_exception détecte si le déroulement de la pile est actuellement en cours.
2) Détecte combien d'exceptions dans le fil d'exécution actuel ont été levées ou relancées et ne sont pas encore entrées dans leurs clauses catch correspondantes.

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

1) true si le déroulement de la pile est actuellement en cours dans ce fil d'exécution, false sinon.
2) Le nombre d'objets exception non attrapés dans le fil d'exécution actuel.

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)
type pointeur partagé pour la manipulation des objets exception
(typedef)
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)