Mode d'évaluation des blocs Catch (C++)

C++ vous permet de lever des exceptions de tout type, bien qu'en général il soit recommandé de lever des types dérivés de std::exception. Une exception C++ peut être interceptée par un catch gestionnaire qui spécifie le même type que l’exception levée, ou par un gestionnaire qui peut intercepter n’importe quel type d’exception.

Si le type de l'exception levée est une classe, qui possède également une classe (ou des classes) de base, elle peut être interceptée par des gestionnaires qui acceptent les classes de base du type de l'exception, ainsi que des références aux bases du type de l'exception. Notez que lorsqu'une exception est interceptée par une référence, elle est associée à l'objet exception levée réel. Dans le cas contraire, il s'agit d'une copie (similaire à un argument pour une fonction).

Lorsqu’une exception est levée, elle peut être interceptée par les types de catch gestionnaires suivants :

  • Gestionnaire capable d'accepter tout type (à l'aide de la syntaxe avec points de suspension).

  • Gestionnaire qui accepte le même type que l’objet d’exception ; étant donné qu’il s’agit d’une copie et constvolatile que les modificateurs sont ignorés.

  • Gestionnaire qui accepte une référence au même type que l'objet exception.

  • Gestionnaire qui accepte une référence à un const ou volatile une forme du même type que l’objet d’exception.

  • Gestionnaire qui accepte une classe de base du même type que l’objet exception ; étant donné qu’il s’agit d’une copie et constvolatile que les modificateurs sont ignorés. Le catch gestionnaire d’une classe de base ne doit pas précéder le catch gestionnaire de la classe dérivée.

  • Gestionnaire qui accepte une référence à une classe de base du même type que l'objet exception.

  • Gestionnaire qui accepte une référence à une const ou volatile une forme d’une classe de base du même type que l’objet d’exception.

  • Gestionnaire qui accepte un pointeur vers lequel un objet pointeur levé peut être converti via des règles de conversion de pointeur standard.

L’ordre dans lequel catch les gestionnaires apparaissent est significatif, car les gestionnaires d’un bloc donné try sont examinés dans l’ordre de leur apparence. Par exemple, il est incorrect de placer le gestionnaire d'une classe de base avant le gestionnaire d'une classe dérivée. Une fois qu’un gestionnaire correspondant catch est trouvé, les gestionnaires suivants ne sont pas examinés. Par conséquent, un gestionnaire de points de suspension catch doit être le dernier gestionnaire de son try bloc. Par exemple :

// ...
try
{
    // ...
}
catch( ... )
{
    // Handle exception here.
}
// Error: the next two handlers are never examined.
catch( const char * str )
{
    cout << "Caught exception: " << str << endl;
}
catch( CExcptClass E )
{
    // Handle CExcptClass exception here.
}

Dans cet exemple, le gestionnaire de points de suspension catch est le seul gestionnaire examiné.

Voir aussi

Meilleures pratiques C++ modernes pour la gestion des exceptions et des erreurs