Main menu:

Site search

Categories

juin 2008
L M M J V S D
 1
2345678
9101112131415
16171819202122
23242526272829
30  

Archive

C++ – Comment capturer une exception

Il y a trois façons de capturer une exception: par valeur, par référence ou par pointeur.

Capture par valeur

Capturer une exception par valeur a deux inconvénients principaux. D’abord cela nécessite une copie de l’objet ce qui, si cet objet est de taille importante, n’est pas très efficient. Ensuite, copier un objet demande du temps et donc une capture par valeur sera forcément plus lente. De plus, si les ressources disponibles sont déjà faibles, cette copie pourrait elle-même provoquer une exception. Générer une exception quand une autre exception est active provoque l’appel de la fonction terminate(). Ce qui n’est pas à conseiller.

Capture par référence

C’est la méthode à préférer. C’est une méthode plus efficiente que par valeur et en plus, les références conservent l’aspect polymorphique des objets. Mais faut-il capturer par référence constante ou non. La règle habituelle s’applique ici aussi. Si on prévoit de ne rien changer à l’objet, autant indiquer qu’il est constant. le compilateur donnera une erreur chaque fois qu’on essaiera de modifier l’objet et tout programmeur saura directement en voyant la référence constante que l’objet ne sera pas modifié.

Capture par pointeur

On pourrait très bien capturer par pointeur mais le problème ici est qui est responsable de la libération de la mémoire et surtout comment ?
Considérons le code suivant:

void f1()
{
  int a = 10;
  throw &a;
}

void f2()
{
  throw new int(10);
}

void f3()
{
  throw new int[10];
}

int main()
{
  try
  {
    f1();
    // ou
    f2();
    // ou
    f3();
  }
  catch( int * p )
  {
    //comment libérer la mémoire?
  }
} 

Le problème ici est clairement que dans le catch(), on ne sait pas s’il faut libérer la mémoire avec delete, delete[] ou ne pas la libérer du tout. c’est impossible à savoir. Autrement dit, on ne capture pas d’exception par pointeur.