« Programmation C++/Les exceptions » : différence entre les versions
Contenu supprimé Contenu ajouté
Ligne 16 :
===Exception C++===
====
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> :
====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.
Exemple de fonction lançant une exception :
====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:
|