1. throw 出现在带有操作数的表达式中时,其效果是抛出异常 ,这是操作数的副本。

    void print_asterisks(int count) {
        if (count < 0) {
            throw std::invalid_argument("count cannot be negative!");
        }
        while (count--) { putchar('*'); }
    }
    
  2. 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;
    }
    
  3. 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"));
}