1. 拋出的異常對象不應該是指針類型
因為指針指向的對象的刪除和析構由誰來處理,什么時候執行,都是無法確定的事情,C++也沒有定義,比如堆和棧上的對象的處理方式必然不一樣
2. 不能顯式地把NULL作為異常對象拋出
因為throw(NULL)=tbrow(0),因此NULL會被當作整型捕獲,而不是空指針常量,這可能與程序員的預期不一致
3. 如果一個函數聲明時指定了具體的異常類型,那么它只能拋出指定類型的異常
函數的代碼結構如下:返回值類型函數名(形參表)throw(類型名表){函數體}
int A() throw(myexception, int)  -- 只能拋出myexception和int兩種類型的異常
int A() throw()                  -- 不拋出任何異常
int A()                          -- 可以拋出任何異常,也可以不拋出異常
函數原型中的異常聲明要與實現中的異常聲明一致,否則會引起異常沖突。由于異常機制是在運行出現異常時才發揮作用的,因此如果函數的實現中拋出了沒有在其異常聲明列表中列出的異常,編譯器也許不能檢查出來。當拋出一個未在其異常聲明列表里的異常類型時,unexpected()函數會被調用,默認會導致std::bad_exception類型的異常被拋出。如果std::bad_exception不在異常聲明列表里,又會導致terminate()被調用,從而導致程序結束
4. 異常只能在初始化之后而且程序結束之前拋出
5. throw語句中的表達式本身不能引發新的異常
6. 空的throw語句只能出現在catch語句塊中
空的throw用來將捕獲的異常再拋出,可以實現多個處理程序問異常的傳遞。然而,如果在catch語句外用,由于沒有捕獲到異常,也就沒有東西可以再拋出,這樣會導致程序以不定的方式終止(這依賴具體的編譯器)
7. 典型的try-catch結構應該是派生派在最前面,基類在后,最后是...
8. catch的處理順序為從上到下,只要找到一個匹配的異常類型,后面的異常處理都被忽略
9. 若異常對象為類的對象時,應該通過引用來捕獲
若不是用引用,則派生類對象總是會被截斷成為基類對象