47 votes

Que fait une seule instruction "throw ;"?

Ces jours-ci, j'ai lu beaucoup de la C++ F.A.Q et surtout cette page .

En lisant cette section, j'ai découvert une "technique" que l'auteur appelle "exception dispatcher" et qui permet à quelqu'un de regrouper toute sa gestion des exceptions dans une seule fonction pratique :

void handleException()
{
  try {
    throw; // ?!
  }
  catch (MyException& e) {
    //...code to handle MyException...
  }
  catch (YourException& e) {
    //...code to handle YourException...
  }
}

void f()
{
  try {
    //...something that might throw...
  }
  catch (...) {
    handleException();
  }
}

Ce qui me dérange, c'est que l'unique throw; Si vous considérez l'exemple donné, il est évident que ce qu'elle fait est évident : elle relance l'exception capturée en premier lieu dans l'instruction f() et s'en occupe à nouveau.

Mais si j'appelle handleException() par elle-même, directement, sans le faire à partir d'une catch() clause ? Existe-t-il un comportement spécifique ?

De plus, pour des points bonus, y a-t-il une autre utilisation "bizarre" (ce n'est probablement pas le bon mot) de l'expression throw que vous connaissez ?

Merci.

47voto

Alan Stokes Points 9095

Si vous faites un throw; et qu'il n'y a pas d'exception courante à relancer, alors le programme se termine brusquement. (Plus précisément, terminate() est appelé).

Notez que throw ; est le seul moyen sûr de relancer l'exception en cours - ce n'est pas équivalent à

catch (exception const & e) { throw e; }

38voto

dalle Points 9083

Oui, il a spécifié le comportement, il appellera terminate ;

15.1, paragraphe 8 : Si aucune exception n'est actuellement traitée, l'exécution d'une expression throw sans opérande appelle terminate() (15.5.1).

7voto

sharptooth Points 93379

C'est ce qu'on appelle un gestionnaire d'exception. Il relance l'exception en cours si elle existe. S'il n'y a pas d'exception en cours de traitement terminate() sera appelé .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X