Comment les blocs catch sont évalués (C++)

C++ vous permet de lever des exceptions de tout type, bien qu'en général il est recommandé de lever des types dérivés du type : : exception.Une exception C++ peut être interceptée par un gestionnaire catch 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 d'exception levée est une classe, qui possède également une classe de base (ou), elle peut être interceptée par se référant des gestionnaires qui acceptent des classes de base du type d'exception, ainsi qu'aux bases du type d'exception.Notez que lorsqu'une exception est interceptée par une référence, elle est liée à l'objet réel d'exception renvoyée ; sinon, il s'agit d'une copie (la plus ou moins même qu'un argument à une fonction).

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

  • Un gestionnaire qui peut accepter n'importe quel type (à l'aide de la syntaxe de sélection).

  • Un gestionnaire qui accepte le même type que l'objet exception ; parce que c'est une copie, const et des modificateurs d' volatile sont ignorés.

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

  • Un gestionnaire qui accepte une référence à un formulaire de const ou d' volatile de même type en tant qu'objet exception.

  • Un gestionnaire qui accepte une classe de base du même type que l'objet exception ; comme il s'agit d'une copie, const et des modificateurs d' volatile sont ignorés.le gestionnaire catch pour une classe de base ne doit pas précéder le gestionnaire catch pour la classe dérivée.

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

  • Un gestionnaire qui accepte une référence à un formulaire de const ou d' volatile d'une classe de base de même type en tant qu'objet exception.

  • Un gestionnaire qui reçoit un pointeur vers lequel un objet levé de pointeur peut être converti via des règles de conversion standard de pointeur.

L'ordre dans lequel les gestionnaires catch apparaissent est important, car les gestionnaires pour test donné se bloquent sont vérifiées dans l'ordre d'apparition.Par exemple, il s'agit d'une erreur pour placer le gestionnaire d'une classe de base avant le gestionnaire pour une classe dérivée.Après qu'un gestionnaire catch correspondant soit trouvé, les gestionnaires suivants ne sont pas vérifiés.Par conséquent, un gestionnaire catch de sélection doit être le dernier gestionnaire pour son bloc de test .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 catch de sélection est le seul gestionnaire qui est examiné.

Voir aussi

Référence

Gestion des exceptions C++