尽管仅抛出从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站点传递一些代码,而无需定义单独的类或函数。
但是捕获lambda(或闭包)是否可能呢?catch([]{} e)
不能工作。
更新(2022/11/14):
请参见此处我自己的答案,考虑到C++20的特性。
catch(...){}
不是期望的。 - Joshuacatch (...) { asm("call %rax"); }
不安全的问题需要不安全的解决方案。 - sudo rm -rf slashcatch(...)
并不理想。 - Krzysiek Karbowiak