59 votes

Est-il possible d'attraper une exception de type lambda?

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.

8voto

dave Points 1660

Vous pouvez lancer et attraper un std::function :

 #include <iostream>
#include <functional>

void f() {
        throw std::function<void(void)>([]{std::cout << "lambda\n"; });
}

int main()
{
        try{ f(); }
        catch( std::function<void(void)> &e)
        {
                e();
                std::cout << "catch\n";
        }
}

Production:

 lambda
catch

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