扔
-
当
throw
出现在带有操作数的表达式中时,其效果是抛出异常 ,这是操作数的副本。void print_asterisks(int count) { if (count < 0) { throw std::invalid_argument("count cannot be negative!"); } while (count--) { putchar('*'); } }
-
当
throw
出现在没有操作数的表达式中时,其效果是重新抛出当前异常 。如果没有当前异常,则调用std::terminate
。try { // something risky } catch (const std::bad_alloc&) { std::cerr << "out of memory" << std::endl; } catch (...) { std::cerr << "unexpected exception" << std::endl; // hope the caller knows how to handle this exception throw; }
-
当
throw
出现在函数声明符中时,它引入了一个动态异常规范,该规范列出了允许函数传播的异常类型。// this function might propagate a std::runtime_error, // but not, say, a std::logic_error void risky() throw(std::runtime_error); // this function can't propagate any exceptions void safe() throw();
从 C++ 11 开始,不推荐使用动态异常规范。
请注意,上面列出的 throw
的前两个用法构成表达式而不是语句。 (throw 表达式的类型是 void
。)这使得它们可以在表达式中嵌套,如下所示:
unsigned int predecessor(unsigned int x) {
return (x > 0) ? (x - 1) : (throw std::invalid_argument("0 has no predecessor"));
}