« Programmation C++/Les exceptions » : différence entre les versions

Contenu supprimé Contenu ajouté
remise en forme snippet code (indentation ANSI)
Aucun résumé des modifications
Ligne 1 :
{{Programmation C++}}
 
== Les exceptions ==
 
Ligne 21 ⟶ 22 :
Le lancement se fait par l'instruction <code>throw</code> :
 
<source lang="cpp"> throw 0;</source>
 
==== Attraper une exception ====
 
Pour attraper une exception, il faut qu'un bloc encadre l'instruction directement, ou indirectement, dans la fonction même ou dans la fonction appelante, ou à un niveau supérieur. Dans le cas contraire, le système récupère l'exception et met fin au programme.
 
Les instructions <code>try</code> et <code>catch</code> sont utilisées pour attraper les exceptions.
<source lang="cpp">
try {
... // code lançant une exception (appel de fonction, ...)
}
catch (int code)
{
cerr << "Exception " << code << endl;
}
</source>
 
Exemple de fonction lançant une exception :
<source lang="cpp">
int division(int a, int b)
{
if (b == 0) throw 0; // division par zéro;
else return a / b;
}
 
void main()
{
try {
cout << "1/0 = " << division(1, 0) << endl;
}
catch (int code)
{
cerr << "Exception " << code << endl;
}
}
</source>
 
==== Attraper toutes les exceptions ====
 
Spécifier les points de suspension dans la clause <code>catch</code> permet d'attraper tous les autres types d'exception :
<source lang="cpp">
void main()
{
try {
cout << "1/0 = " << division(1, 0) << endl;
}
catch (int code)
{
cerr << "Exception " << code << endl;
}
catch (...)
{
cerr << "Exception inconnue !!!" << endl;
}
}
</source>
 
==== Déclaration des exceptions lancées ====
 
La déclaration d'une fonction lançant un nombre limité de type d'exception, telle que la fonction <code>division</code> de l'exemple précédent, peut être suivie d'une liste de ces types d'exceptions dans une clause <code>throw</code> :
<source lang="cpp">
int division(int a, int b) throw(int)
{
if (b == 0) throw 0; // division par zéro;
else return a / b;
}
</source>
 
Par défaut, la fonction peut lancer n'importe quel type d'exception. La déclaration de la fonction <code>division</code> sans clause <code>throw</code> est donc équivalent à la déclaration suivante :
<source lang="cpp">
int division(int a, int b) throw(...) // n'importe quel type d'exception
{
if (b == 0)
throw 0; // division par zéro;
else
return a / b;
}
</source>
 
Si une fonction ne lance aucune exception, on peut la déclarer avec une clause <code>throw</code> vide :
<source lang="cpp">
int addition(int a, int b) throw() // aucune exception
{
return a+b;
}
</source>
 
Cette clause peut être présente dans les cas suivants :
* prototype de fonction
Ligne 115 ⟶ 125 :
#include <exception>
#include <iostream>
 
void maTerminate()
{
std::cout << "Si vous en etes la, vous etes mal." << std::endl;
}
 
int main()
{