freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

c電子課件(下)第十章(編輯修改稿)

2024-11-12 15:50 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 建立 函數(shù)調(diào)用 所需要的全部信息在 編譯 時(shí)已經(jīng)獲得,而異常處理 機(jī)制要求 運(yùn)行時(shí) 的支持。 對(duì)于普通函數(shù)調(diào)用,通過(guò)函數(shù)重載解析過(guò)程,編譯器知道在調(diào)用點(diǎn)上哪個(gè)函數(shù)會(huì)真正被調(diào)用。但對(duì)于 異常處理 ,編譯器 不知道特定的 throw表達(dá)式的 catch子句在哪個(gè)函數(shù)中,以及在處理異常之后執(zhí)行權(quán)被轉(zhuǎn)移到哪兒。 這些都在運(yùn)行時(shí)刻決定, 異常是隨機(jī)發(fā)生的,異常處理的 catch子句是逆調(diào)用鏈進(jìn)行查找 ,這與運(yùn)行時(shí)的多態(tài) —— 虛函數(shù)也是不一樣的。 當(dāng)一個(gè)異常不存在處理代碼時(shí),系統(tǒng)無(wú)法通知用戶(hù),所以要有 terminate()函數(shù),它是一種運(yùn)行機(jī)制,當(dāng)沒(méi)有處理代碼( catch子句)能夠匹配被拋出的異常時(shí),由它通知用戶(hù)。 異常的重新拋出和 catch_all子句(選讀) rethrow表達(dá)式仍為: throw。 但僅有一個(gè)關(guān)鍵字,因?yàn)楫惓n?lèi)型在 catch語(yǔ)句中已經(jīng)有了,不必再指明。被重新拋出的異常就是原來(lái)的異常對(duì)象。 但是重新拋出異常的 catch子句應(yīng)該把自己做過(guò)的工作告訴下一個(gè)處理異常的 catch子句,往往要對(duì)異常對(duì)象做一定修改,以表達(dá)某些信息,因此 catch子句中的異常聲明必須被聲明為 引用 ,這樣修改才能真正做在異常對(duì)象自身中,而不是副本中。 異常的重新拋出與連續(xù)處理: 當(dāng) catch語(yǔ)句捕獲一個(gè)異常后,可能不能完全處理異常,完成某些操作后,該異常必須由函數(shù)鏈中更上級(jí)的函數(shù)來(lái)處理,這時(shí) catch子句可以重新拋出( rethrow)該異常,把異常傳遞給函數(shù)調(diào)用鏈中更上級(jí)的另一個(gè)catch子句,由它進(jìn)行進(jìn)一步處理。 異常的重新拋出和 catch_all子句(選讀) 通用 catch子句 (catch_all): catch(...){ /*代碼 */ } 任何異常都可以進(jìn)入這個(gè) catch子句。這里的三個(gè)點(diǎn)稱(chēng)為省略號(hào)?;ɡㄌ?hào)中的復(fù)合語(yǔ)句用來(lái)執(zhí)行指定操作。 異常發(fā)生后按棧展開(kāi)( stack unwinding)退出,動(dòng)態(tài)分配的 非類(lèi)對(duì)象 資源不會(huì)自動(dòng)釋放的,可以在 catch_all子句中釋放。 void fun1(){ int *res。 res=new int[100]。 //定義一個(gè)資源對(duì)象 try{ //代碼包括使用資源 res和某些可能引起異常拋出的操作 } //異常可能有多種 catch(...){ //不論是那種異常都在此釋放 delete [] res。 //釋放資源對(duì)象 res throw。 }//重新拋出異常 delete [] res。 } //正常退出前釋放資源對(duì)象 res。 異常的重新拋出和 catch_all子句(選讀) catch_all子句可以單獨(dú)使用 , 也可以與其它 catch子句聯(lián)合使用 。 如果聯(lián)合使用 , 它必須放在 相關(guān) catch子句表的最后 。 catch子句被檢查的順序與它們?cè)?try塊之后排列順序相同 , 一旦找到了一個(gè)匹配 , 則后續(xù)的 catch子句將不再檢查 , 按此規(guī)則 , catch_all子句 ( catch(...){}) 處理表前面所列各種異常之外的異常 。 如果只用 catch_all子句進(jìn)行某項(xiàng)操作 , 則其他的操作應(yīng)由 catch_all子句 重新拋出異常 , 逆調(diào)用鏈去查找新的處理子句來(lái)處理 , 不能在子句列表中再安排一個(gè)處理同一異常的子句 , 因?yàn)?第二個(gè)子句是永遠(yuǎn)執(zhí)行不到的 。 通用 catch子句的應(yīng)用: 異常和繼承 定義一個(gè)稱(chēng)為 Excp的基類(lèi),由它來(lái)打印錯(cuò)誤信息: class Excp{public:void print(string msg){ cerrmsgendl。} }。 再?gòu)脑摶?lèi)派生出兩個(gè)異常類(lèi) : class stackExcp:public Excp{...}。 //棧異常類(lèi)的基類(lèi) class mathExcp:public Excp{...}。 //數(shù)學(xué)庫(kù)異常的基類(lèi) 進(jìn)一步派生出其他 異常類(lèi) : class popOnEmpty:public stackExcp{...}。 //??胀藯.惓? class pushOnFull:public stackExcp{...}。 //棧滿(mǎn)壓棧異常 class zeroOp:public mathExcp{...}。 //數(shù)學(xué)庫(kù)零操作異常 class divideByZero:public mathExcp{...}。 //數(shù)學(xué)庫(kù)被零除異常 異常的層次結(jié)構(gòu): 在 C++程序中,表示異常的類(lèi)通常被組成為一個(gè)組(即如在前面各節(jié)討論的那樣)或者一個(gè) 層次結(jié)構(gòu) 。 形成了三層結(jié)構(gòu)。 異常和繼承 在層次結(jié)構(gòu)下,異常的拋出會(huì)有一些不同,以下做法是錯(cuò)的 : if(full()){ pushOnFull except(data)。 stackExcp *pse=amp。except。 //pse指向的類(lèi)對(duì)象為 pushOnFull throw *pse。 //拋出的異常對(duì)象的類(lèi)型為 stackExcp } 這里被創(chuàng)建的異常類(lèi)對(duì)象是 stackExcp類(lèi)類(lèi)型,盡管pse指向一個(gè)實(shí)際類(lèi)型為 pushOnFull的對(duì)象,但那是一個(gè)臨時(shí)對(duì)象,復(fù)制到異常對(duì)象的存儲(chǔ)區(qū)中時(shí)創(chuàng)建的卻是 stackExcp類(lèi)的異常對(duì)象。所以該異常不能被pushOnFull類(lèi)型的 catch子句處理。 層次結(jié)構(gòu)異常的拋出: 異常和繼承 在處理類(lèi)類(lèi)型異常時(shí), catch子句的排列順序是非常重要的。catch(pushOnFull){...} //處理 pushOnFull異常 catch(stackExcp){...} //處理?xiàng)5钠渌惓? catch(Excp){...} //處理一般異常 派生類(lèi)類(lèi)型的 catch子句必須先出現(xiàn),以確保只有在沒(méi)有其他catch子句適用時(shí),才會(huì)進(jìn)入基類(lèi)類(lèi)型的 catch子句。 異常 catch子句不必是與異常最匹配的 catch子句,而是 最先匹配到的 catch子句 ,就是第一個(gè)遇到的可以處理該異常的catch子句。所以在 catch子句列表中 最特化的 (匹配條件最嚴(yán)格的) catch子句 必須先出現(xiàn) 。 除非重新拋出。 catch子句的排列順序: 異常和繼承 類(lèi)層次結(jié)構(gòu)的異常同樣可以重新拋出( rethrow),把一個(gè)異常傳遞給函數(shù)調(diào)用列表中 更上層 的另一個(gè) catch子句: throw。 類(lèi)層次結(jié)構(gòu)下的異常重新拋出: 重新拋出的異常仍是原來(lái)的異常對(duì)象。如果程序中拋出了pushOnFull類(lèi)類(lèi)型的異常,而它 被基類(lèi)的 catch子句處理 ,并
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1