Que fait une seule déclaration de «lancer»?

Ces jours-ci, j’ai beaucoup lu la FAQ C ++ et surtout cette page .

En parcourant la section, j’ai découvert une “technique” que l’auteur appelle “répartiteur d’exceptions”, qui permet à quelqu’un de regrouper toutes ses opérations d’exception en 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 le throw; unique throw; statement: si vous considérez l’exemple donné alors c’est sûr, il est évident ce qu’il fait: il relance l’exception d’abord capturée dans f() et la traite à nouveau.

Mais si j’appelle handleException() directement, sans le faire à partir d’une clause catch() ? Y a-t-il un comportement spécifié?

De plus pour les points bonus, y a-t-il un autre usage “bizarre” (probablement pas le bon mot) que vous connaissez?

Je vous remercie.

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

Notez ce lancer; est le seul moyen sûr de repousser l’exception actuelle – ce n’est pas équivalent à

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

Oui, il spécifiait le comportement, il appellerait terminer;

15.1, para 8: Si aucune exception n’est en cours de traitement, l’exécution d’une expression d’envoi sans appel d’opérande se termine () (15.5.1).

C’est ce qu’on appelle un gestionnaire d’exceptions. Il relance l’exception actuelle, le cas échéant. S’il n’y a pas d’exception en cours de traitement, terminate() sera appelé .