1. 拋出的異常對(duì)象不應(yīng)該是指針類(lèi)型
因?yàn)橹羔樦赶虻膶?duì)象的刪除和析構(gòu)由誰(shuí)來(lái)處理,什么時(shí)候執(zhí)行,都是無(wú)法確定的事情,C++也沒(méi)有定義,比如堆和棧上的對(duì)象的處理方式必然不一樣
2. 不能顯式地把NULL作為異常對(duì)象拋出
因?yàn)閠hrow(NULL)=tbrow(0),因此NULL會(huì)被當(dāng)作整型捕獲,而不是空指針常量,這可能與程序員的預(yù)期不一致
3. 如果一個(gè)函數(shù)聲明時(shí)指定了具體的異常類(lèi)型,那么它只能拋出指定類(lèi)型的異常
函數(shù)的代碼結(jié)構(gòu)如下:返回值類(lèi)型函數(shù)名(形參表)throw(類(lèi)型名表){函數(shù)體}
int A() throw(myexception, int)  -- 只能拋出myexception和int兩種類(lèi)型的異常
int A() throw()                  -- 不拋出任何異常
int A()                          -- 可以拋出任何異常,也可以不拋出異常
函數(shù)原型中的異常聲明要與實(shí)現(xiàn)中的異常聲明一致,否則會(huì)引起異常沖突。由于異常機(jī)制是在運(yùn)行出現(xiàn)異常時(shí)才發(fā)揮作用的,因此如果函數(shù)的實(shí)現(xiàn)中拋出了沒(méi)有在其異常聲明列表中列出的異常,編譯器也許不能檢查出來(lái)。當(dāng)拋出一個(gè)未在其異常聲明列表里的異常類(lèi)型時(shí),unexpected()函數(shù)會(huì)被調(diào)用,默認(rèn)會(huì)導(dǎo)致std::bad_exception類(lèi)型的異常被拋出。如果std::bad_exception不在異常聲明列表里,又會(huì)導(dǎo)致terminate()被調(diào)用,從而導(dǎo)致程序結(jié)束
4. 異常只能在初始化之后而且程序結(jié)束之前拋出
5. throw語(yǔ)句中的表達(dá)式本身不能引發(fā)新的異常
6. 空的throw語(yǔ)句只能出現(xiàn)在catch語(yǔ)句塊中
空的throw用來(lái)將捕獲的異常再拋出,可以實(shí)現(xiàn)多個(gè)處理程序問(wèn)異常的傳遞。然而,如果在catch語(yǔ)句外用,由于沒(méi)有捕獲到異常,也就沒(méi)有東西可以再拋出,這樣會(huì)導(dǎo)致程序以不定的方式終止(這依賴(lài)具體的編譯器)
7. 典型的try-catch結(jié)構(gòu)應(yīng)該是派生派在最前面,基類(lèi)在后,最后是...
8. catch的處理順序?yàn)閺纳系较拢灰业揭粋€(gè)匹配的異常類(lèi)型,后面的異常處理都被忽略
9. 若異常對(duì)象為類(lèi)的對(duì)象時(shí),應(yīng)該通過(guò)引用來(lái)捕獲
若不是用引用,則派生類(lèi)對(duì)象總是會(huì)被截?cái)喑蔀榛?lèi)對(duì)象