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
const
volatile
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
ouvolatile
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
const
volatile
que les modificateurs sont ignorés. Lecatch
gestionnaire d’une classe de base ne doit pas précéder lecatch
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
ouvolatile
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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour