C++ Primer 5th笔记(chap 18 大型程序工具)异常处理
1. 異常處理 ( exception handling)
允許程序中獨(dú)立開發(fā)的部分能夠在運(yùn)行時(shí)就出現(xiàn)的問題進(jìn)行通信并做出相應(yīng)的處理。
異常使得我們能夠?qū)栴}的檢測與解決過程分離開來。 程序的一部分負(fù)責(zé)檢測問題的出現(xiàn), 然后解決該問題的任務(wù)傳遞給程序的另一部分
1.1 棧展開( stack unwinding)
當(dāng)拋出一個(gè)異常后, 程序暫停當(dāng)前函數(shù)的執(zhí)行過程并立即開始尋找與異常匹配的catch 子句。 當(dāng) throw 出現(xiàn)在一個(gè) try 語句塊( try block) 內(nèi)時(shí), 檢查與該 try 塊關(guān)聯(lián)的 catch 子句。 如果找到了匹配的 catch, 就使用該 catch 處理異常。 如果這一步?jīng)]找到匹配的 catch 且該 try 語句嵌套在其他 try 塊中, 則繼續(xù)檢查與外層 try 匹配的catch 子句。 如果還是找不到匹配的 catch, 則退出當(dāng)前的函數(shù), 在調(diào)用當(dāng)前函數(shù)的外層函數(shù)中繼續(xù)尋找。
當(dāng)找不到匹配的 catch時(shí), 程序?qū)⒄{(diào)用標(biāo)準(zhǔn)庫函數(shù) terminate, 顧名思義, terminate 負(fù)責(zé)終止程序的執(zhí)行過程
1.2 棧展開過程中對(duì)象被自動(dòng)銷毀
1.3 析構(gòu)函數(shù)與異常
如果一個(gè)塊分配了資源, 并且在負(fù)責(zé)釋放這些資源的代碼前[(D 發(fā)生了異常, 則釋放資源的代碼
將不會(huì)被執(zhí)行。 另 --方面, 類對(duì)象分配的資源將由類的析構(gòu)函數(shù)負(fù)責(zé)釋放
1.4 異常對(duì)象( exception object )
編譯器使用異常拋出表達(dá)式來對(duì)異常對(duì)象進(jìn)行拷貝初始化
當(dāng)拋出一條表達(dá)式時(shí), 該表達(dá)式的靜態(tài)編譯時(shí)類型決定了異常對(duì)象的類型。 因?yàn)楹芏嗲闆r下程序拋出的表達(dá)式類型來自于某個(gè)繼承體系。 如果一條 throw 表達(dá)式解引用一個(gè)基類指針, 而該指針實(shí)際指向的
是派生類對(duì)象, 則拋出的對(duì)象將被切掉一部分, 只有基類部分被拋出。
總結(jié)
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 18 大型程序工具)异常处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Primer 5th笔记(cha
- 下一篇: C++ Primer 5th笔记(cha