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"));
}