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

Contenu supprimé Contenu ajouté
Ligne 16 :
===Exception C++===
 
====TypeLancer une d'exception====
Lancer une exception consiste à retourner une erreur sous la forme d'une valeur (message, code, objet exception) dont le type peut être quelconque (<code>int</code>, <code>char*</code>, <code>MyExceptionClass</code>, ...).
 
Le lancement se fait par l'instruction <code>throw</code> :
 
throw 0;
 
====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.
 
try{
... // code lançant une exception (appel de fonction, ...)
}
catch(int code)
{
cerr << "Exception " << code << endl;
}
 
Exemple de fonction lançant une exception :
 
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;
}
}
 
====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 :
 
void main()
{
try{
cout << "1/0 = " << division(1,0) << endl;
}
catch(int code)
{
cerr << "Exception " << code << endl;
}
catch(...)
{
cerr << "Exception inconnue !!!" << endl;
}
}
 
====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> :
 
int division(int a,int b) throw(int)
{
if (b==0) throw 0; // division par zéro;
else return a/b;
}
 
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 :
 
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;
}
 
Si une fonction ne lance aucune exception, on peut la déclarer avec une clause <code>throw</code> vide :
 
int addition(int a,int b) throw() // aucune exception
{
return a+b;
}
 
Cette clause peut être présente dans les cas suivants :
* prototype de fonction
* implémentation de fonction
* pointeur de fonction
En revanche, il n'est pas possible de l'utiliser avec <code>typedef</code>.
 
Une déclaration avec clause <code>throw</code> limite donc les types d'exception que la fonction peut lancer.
Toute tentative de lancer un autre type d'exception est détecté à la compilation.
 
L'utilisation de la clause <code>throw</code> reste rare car rend les pointeurs de fonctions incompatibles s'ils ne possèdent pas une clause couvrant les types lancés par la fonction pointée.
 
 
<!-- à compléter: