Bien qu'il soit bon de lancer uniquement les exceptions des types dérivés de la std::exception
, C ++ permet de lancer n'importe quoi. Tous les exemples ci-dessous sont valides en C ++:
throw "foo"; // throws an instance of const char*
throw 5; // throws an instance of int
struct {} anon;
throw anon; // throws an instance of not-named structure
throw []{}; // throws a lambda!
Le dernier exemple est intéressant, car il permet potentiellement de passer du code à exécuter sur le site catch sans avoir à définir une classe ou une fonction distincte.
Mais est-il possible d'attraper un lambda (ou une fermeture)? catch ([]{} e)
ne fonctionne pas.