Namespaces
Variants

try block

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Une exception levée dans un bloc try peut potentiellement être gérée par un gestionnaire associé.

Table des matières

Syntaxe

try instruction-composée séquence-de-gestionnaires (1)
try initialiseur-de-constructeur  (optionnel) instruction-composée séquence-de-gestionnaires (2)
2) Un bloc try de fonction . compound-statement doit être le composant d'instruction composée d'un corps de fonction.
compound-statement - une instruction composée
handler-seq - une séquence non vide de gestionnaires
ctor-initializer - liste d'initialisation des membres (uniquement pour les constructeurs )

Bloc try ordinaire

Un bloc try ordinaire est une instruction .

Si une exception est levée depuis son compound-statement , l'exception sera comparée aux handlers dans sa handler-seq :

void f()
{
    throw 1;     // NON géré par le gestionnaire ci-dessous
    try
    {
        throw 2; // géré par le gestionnaire associé
    }
    catch (...)
    {
        // gère l'exception 2
    }
    throw 3;     // NON géré par le gestionnaire ci-dessus
}

Bloc try de fonction

Un bloc de fonction try est un type particulier de corps de fonction .

Si une exception est levée depuis son compound-statement ou son ctor-initializer (le cas échéant), l'exception sera comparée aux handlers dans sa handler-seq :

int f(bool cond)
{
    if (cond)
        throw 1;
    return 0;
}
struct X
{
    int mem;
    X() try : mem(f(true)) {}
    catch (...)
    {
        // gère l'exception 1
    }
    X(int) try
    {
        throw 2;
    }
    catch (...)
    {
        // gère l'exception 2
    }
};

Les exceptions levées dans les destructeurs d'objets ayant une durée de stockage statique ou dans les constructeurs d'objets associés à des variables non-bloc avec durée de stockage statique ne sont pas capturées par un bloc try de fonction sur la main fonction .

Les exceptions levées dans les destructeurs d'objets avec durée de stockage de thread ou dans les constructeurs d'objets associés à des variables non-bloquantes avec durée de stockage de thread ne sont pas capturées par un bloc try fonction sur la fonction initiale du thread.

(since C++11)

Sortir de la fin du compound-statement d'un handler d'un bloc try de fonction est équivalent à sortir de la fin du compound - statement de ce bloc try de fonction, sauf si la fonction est un constructeur ou un destructeur (voir ci-dessous).

Constructeur et destructeur try block

Pour une classe C , si le corps de la fonction de sa définition de constructeur ou de destructeur est un bloc try de fonction, et qu'une exception est levée pendant l'initialisation ou la destruction, respectivement, des sous-objets de C , l'exception sera également comparée aux gestionnaires dans la séquence-de-gestionnaires  du bloc try de fonction :

int f(bool cond = true)
{
    if (cond)
        throw 1;
    return 0;
}
struct X
{
    int mem = f();
    ~X()
    {
        throw 2;
    }
};
struct Y
{
    X mem;
    Y() try {}
    catch (...)
    {
        // gère l'exception 1
    }
    ~Y() try {}
    catch (...)
    {
        // gère l'exception 2
    }
};

Se référer à tout membre non statique ou classe de base d'un objet dans le gestionnaire d'un bloc try d'un constructeur ou destructeur pour cet objet entraîne un comportement indéfini.

Si une return instruction apparaît dans un gestionnaire du bloc try de fonction d'un constructeur, le programme est mal formé.

L' exception actuellement gérée est relancée si le contrôle atteint la fin d'un gestionnaire du bloc try de fonction d'un constructeur ou destructeur.

Flux de contrôle

La compound-statement d'un bloc try est une instruction à flux de contrôle limité :

void f()
{
    goto label;     // erreur
    try
    {
        goto label; // OK
        label: ;
    }
    catch (...)
    {
        goto label; // erreur
    }
}

Une instruction de saut ( goto , break , return , continue ) peut être utilisée pour transférer le contrôle hors d'un try block (y compris ses gestionnaires). Lorsque cela se produit, chaque variable déclarée dans le try block sera détruite dans le contexte qui contient directement sa déclaration :

try
{
    T1 t1;
    try
    {
        T2 t2;
        goto label; // détruire d'abord t2, puis t1
    }
    catch(...)
    {
        // exécuté si une exception est levée lors de la destruction de t2
    }
}
catch(...)
{
    // exécuté si une exception est levée lors de la destruction de t1
}
label: ;

Mots-clés

try

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 Applicable à Comportement publié Comportement corrigé
CWG 98 C++98 une instruction switch peut transférer le contrôle
dans la compound-statement d'un bloc try
interdit
CWG 1167 C++98 il n'était pas spécifié si un bloc try de fonction sur un destructeur
intercepterait les exceptions d'un destructeur de base ou de membre
ces exceptions
sont interceptées

Voir aussi