Хотя хорошей практикой является использование только исключений типов, полученных из std::exception
, C++ позволяет выбросить что-либо. Все приведенные ниже примеры действительны 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!
Последний пример интересен, поскольку он потенциально позволяет передавать некоторый код для выполнения на сайте catch без необходимости определять отдельный класс или функцию.
Но возможно ли вообще поймать лямбду (или закрытие)? catch ([]{} e)
не работает.