![異常(exception)是程序控制中的偶發(fā)事件異_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/4447c033-7983-4f36-8f74-d5659747503b/4447c033-7983-4f36-8f74-d5659747503b1.gif)
![異常(exception)是程序控制中的偶發(fā)事件異_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/4447c033-7983-4f36-8f74-d5659747503b/4447c033-7983-4f36-8f74-d5659747503b2.gif)
![異常(exception)是程序控制中的偶發(fā)事件異_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/4447c033-7983-4f36-8f74-d5659747503b/4447c033-7983-4f36-8f74-d5659747503b3.gif)
![異常(exception)是程序控制中的偶發(fā)事件異_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/4447c033-7983-4f36-8f74-d5659747503b/4447c033-7983-4f36-8f74-d5659747503b4.gif)
![異常(exception)是程序控制中的偶發(fā)事件異_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/4447c033-7983-4f36-8f74-d5659747503b/4447c033-7983-4f36-8f74-d5659747503b5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、C/C+程序設計程序設計1 異常異常(exception)是程序控制中的偶發(fā)事件。異是程序控制中的偶發(fā)事件。異常的來源分兩種:一種是硬件異常如常的來源分兩種:一種是硬件異常如CPU觸發(fā)的異觸發(fā)的異常,一種是軟件異常。軟件異常是程序設計不周操常,一種是軟件異常。軟件異常是程序設計不周操作次序不當引發(fā)的意外。作次序不當引發(fā)的意外。 異常處理就是關于不期望的事件發(fā)生后進行妥異常處理就是關于不期望的事件發(fā)生后進行妥當應付的方法。當應付的方法。C+異常處理機制提供了捕獲各種異常處理機制提供了捕獲各種數(shù)據(jù)類型不測消息的能力。數(shù)據(jù)類型不測消息的能力。C/C+程序設計程序設計2C/C+程序設計程序設計3一、異
2、常處理的概況一、異常處理的概況 程序設計中首先是確保代碼正常運行,盡量避免錯誤。程序設計中首先是確保代碼正常運行,盡量避免錯誤。因此在異常處理之前設置一套防范措施是更重要的編程工因此在異常處理之前設置一套防范措施是更重要的編程工作。作。C+異常處理并不著眼于錯誤的事先禁止,也無力應付異常處理并不著眼于錯誤的事先禁止,也無力應付硬件的莫測操作導致的軟件的崩潰。硬件的莫測操作導致的軟件的崩潰。 異常處理的共同焦點是錯誤發(fā)生后如何應對,有兩種主異常處理的共同焦點是錯誤發(fā)生后如何應對,有兩種主要的風格:一種風格是在錯誤發(fā)生的現(xiàn)場進行清理工作,資要的風格:一種風格是在錯誤發(fā)生的現(xiàn)場進行清理工作,資源的分
3、配和釋放在同一個程序塊中進行;另一種作風是在低源的分配和釋放在同一個程序塊中進行;另一種作風是在低層檢查到的錯誤反饋到高層統(tǒng)一處理,低層對應被調函數(shù)的層檢查到的錯誤反饋到高層統(tǒng)一處理,低層對應被調函數(shù)的程序段,高層對應主控函數(shù)??偟脑瓌t是錯誤及時的捕獲,程序段,高層對應主控函數(shù)??偟脑瓌t是錯誤及時的捕獲,盡量有效地進行錯誤的排除,程序的損失減至最少。盡量有效地進行錯誤的排除,程序的損失減至最少。 C/C+程序設計程序設計4 C+異常處理僅是各種異常處理方法中的一種而已。好異常處理僅是各種異常處理方法中的一種而已。好的容錯性強的程序設計是通過簡單的的容錯性強的程序設計是通過簡單的ifelse語句
4、、層次分明語句、層次分明的短路邏輯判斷表達式和方向直接的的短路邏輯判斷表達式和方向直接的goto語句一起組合實現(xiàn)語句一起組合實現(xiàn)的。的。 短路邏輯表達式負責輕重緩急的消息過濾,短路邏輯表達式負責輕重緩急的消息過濾,ifelse語句語句掌管消息的分流,將正常情況的代碼置于掌管消息的分流,將正常情況的代碼置于 if 分支下,異常的分支下,異常的狀況置于狀況置于 else 分支下。分支下。Goto 語句擅長將多層嵌套的內(nèi)層犯語句擅長將多層嵌套的內(nèi)層犯規(guī)直接彈出到一個統(tǒng)一的外層出口,規(guī)直接彈出到一個統(tǒng)一的外層出口,return帶表達式直接返帶表達式直接返回更是被調函數(shù)運作成功與否的鮮明標志,程序員可以
5、指定回更是被調函數(shù)運作成功與否的鮮明標志,程序員可以指定返回數(shù)值的實際語義。返回數(shù)值的實際語義。 C/C+程序設計程序設計5 C+異常處理相對于早已有之的容錯處理進行了如何的異常處理相對于早已有之的容錯處理進行了如何的提煉和拔高呢?提煉和拔高呢? 首先該機制平和地過渡了被調函數(shù)和主控函數(shù)之間的界首先該機制平和地過渡了被調函數(shù)和主控函數(shù)之間的界限,錯誤可以在低層及時清理也可以到高層收拾,這樣低層限,錯誤可以在低層及時清理也可以到高層收拾,這樣低層的錯誤信息可以越過函數(shù)調用的分界向上引渡到主控函數(shù),的錯誤信息可以越過函數(shù)調用的分界向上引渡到主控函數(shù),直接主控函數(shù)不處理,間接的主控函數(shù)則予以過問,或
6、最終直接主控函數(shù)不處理,間接的主控函數(shù)則予以過問,或最終輸送到輸送到main函數(shù)。函數(shù)。 其次引進一組相關的語句專門處理異常,這樣程序的分其次引進一組相關的語句專門處理異常,這樣程序的分工就顯得井然有序。工就顯得井然有序。 這一組專門實施異常處理的語句是關于結構化異常處這一組專門實施異常處理的語句是關于結構化異常處理、理、ifelse、堆棧動態(tài)跟蹤等復雜技術的綜合和抽象。、堆棧動態(tài)跟蹤等復雜技術的綜合和抽象。C/C+程序設計程序設計6二、二、C+異常處理的途徑異常處理的途徑 C+提供了一個平行于或超然于函數(shù)調用鏈的異常處理提供了一個平行于或超然于函數(shù)調用鏈的異常處理上下環(huán)境,這個異常處理環(huán)境目
7、前尚不夠應對低層的硬件偶上下環(huán)境,這個異常處理環(huán)境目前尚不夠應對低層的硬件偶發(fā)錯誤,因此發(fā)錯誤,因此C+異常處理適宜于高級程序員恰當撫平程序異常處理適宜于高級程序員恰當撫平程序邏輯中暗伏的漏洞。邏輯中暗伏的漏洞。 關鍵字關鍵字try、catch和和throw就是對異常進行處理的。該就是對異常進行處理的。該異常處理的優(yōu)點在于對不測錯誤的攔截可在程序的任何地方異常處理的優(yōu)點在于對不測錯誤的攔截可在程序的任何地方做出響應,可以集中排放錯誤處理代碼也可以隨處布點跟蹤做出響應,可以集中排放錯誤處理代碼也可以隨處布點跟蹤同時尚可以一層一層地向上拋出。同時尚可以一層一層地向上拋出。C/C+程序設計程序設計7
8、下面先介紹三個關鍵字的含義:下面先介紹三個關鍵字的含義: 1. try 內(nèi)嵌內(nèi)嵌throw語句的語句序列;語句的語句序列; 2. throw type_expre;throw; 3. catch ( type expre ) 匹配匹配throw 拋出的拋出的type_expre 的語句塊的語句塊; catch (.) 匹配任意類型的語句塊匹配任意類型的語句塊; 關鍵字關鍵字try緊跟一對花括號包含的語句塊,稱為緊跟一對花括號包含的語句塊,稱為try塊。塊。 try塊中的序列語句包含直接的或間接的塊中的序列語句包含直接的或間接的throw語句,這語句,這些些throw語句潛在的描向一個同級的語句
9、潛在的描向一個同級的catch的入口,因此觸的入口,因此觸發(fā)發(fā)catch塊起作用。其中塊起作用。其中type表示已經(jīng)聲明的類型,如表示已經(jīng)聲明的類型,如float,long以及結構名等。以及結構名等。 C/C+程序設計程序設計8 關鍵字關鍵字throw 跟隨一個表達式語句,其后的表達式等價跟隨一個表達式語句,其后的表達式等價于于return所要求的操作數(shù),其作用也類似于所要求的操作數(shù),其作用也類似于return的返回轉的返回轉向作用??梢哉f帶表達式的向作用??梢哉f帶表達式的throw語句是語句是return語句和語句和goto標號語句的融合。標號語句的融合。return將控制權返回給主控函數(shù),
10、將控制權返回給主控函數(shù),goto將將流程直接轉移到指定的標號處但跳轉由內(nèi)向外地限于一個函流程直接轉移到指定的標號處但跳轉由內(nèi)向外地限于一個函數(shù)體內(nèi);數(shù)體內(nèi);throw可以遠程拋射,流程從拋設點暗攜可以遠程拋射,流程從拋設點暗攜return的的控制撤離機制,直奔所在控制撤離機制,直奔所在try塊后的塊后的catch塊的單參入口。塊的單參入口。 throw也可近處投擲異常,相當于也可近處投擲異常,相當于goto的段內(nèi)向下跳的段內(nèi)向下跳轉轉 。 throw關鍵字不帶表達式時表示類型信息流的默認傳關鍵字不帶表達式時表示類型信息流的默認傳遞,相當于在當前遞,相當于在當前catch塊暗中接受了前次投擲過來
11、的類型塊暗中接受了前次投擲過來的類型信息然后接著拋出,傳遞到后面的信息然后接著拋出,傳遞到后面的catch塊處理。塊處理。 C/C+程序設計程序設計9 關鍵字關鍵字catch之后是圓括號包括的單參數(shù)入口形參,其之后是圓括號包括的單參數(shù)入口形參,其后再緊跟一對花括號定界的復合語句,形式上簡直活脫脫是后再緊跟一對花括號定界的復合語句,形式上簡直活脫脫是整個地將函數(shù)的定義體直接插入另一個函數(shù)代碼中,大抵上整個地將函數(shù)的定義體直接插入另一個函數(shù)代碼中,大抵上也不妨這么看待,因此也不妨這么看待,因此catch塊稱為捕獲處理器。定界的一塊稱為捕獲處理器。定界的一對花括號和單參數(shù)入口的類名是不可或缺的,其后
12、的形參對花括號和單參數(shù)入口的類名是不可或缺的,其后的形參expre則可有可無。但一旦派上用途其則可有可無。但一旦派上用途其expre的作用域限于的作用域限于該該catch處理器。省掉處理器。省掉expre的形式,的形式,catch中不能接受中不能接受throw拋出的數(shù)值而只捕獲類型信息。拋出的數(shù)值而只捕獲類型信息。 省略號省略號(.)的入口捕獲處理器表示處理任意類型的的入口捕獲處理器表示處理任意類型的throw表達式,可稱為默認捕獲處理器。因此這個默認捕獲表達式,可稱為默認捕獲處理器。因此這個默認捕獲處理器放置在多個處理器放置在多個catch塊的最后,保證先執(zhí)行特定類型的塊的最后,保證先執(zhí)行特
13、定類型的錯誤過濾,然后才進行一般的處理。錯誤過濾,然后才進行一般的處理。C/C+程序設計程序設計10 throw拋出的表達式既有數(shù)值也有該數(shù)值對應的類型,拋出的表達式既有數(shù)值也有該數(shù)值對應的類型,類型是第一重要的,其次才是數(shù)值。類型是第一重要的,其次才是數(shù)值。throw拋出一個類型,拋出一個類型,catch捕獲處理器進行攔截,攔截的指標就是其入口的類捕獲處理器進行攔截,攔截的指標就是其入口的類型。如果捕獲入口的類型和型。如果捕獲入口的類型和throw投射的類型一致,則觸發(fā)投射的類型一致,則觸發(fā)離拋射位置最近的離拋射位置最近的catch處理器,其次處理器,其次throw表達式的值初表達式的值初始
14、化始化catch的形參;不帶表達式的的形參;不帶表達式的throw默認投擲,其暗中默認投擲,其暗中接受的類型發(fā)射到下一個默認的接受的類型發(fā)射到下一個默認的catch(.)處理器。處理器。 try塊中一般包含至少一條塊中一般包含至少一條throw語句,根本不含語句,根本不含throw語句的語句的try塊形同虛設塊形同虛設,導致其后的導致其后的catch成為死碼區(qū)。不在成為死碼區(qū)。不在try塊之內(nèi)的塊之內(nèi)的throw語句觸發(fā)程序的非正常結束,是編程的禁語句觸發(fā)程序的非正常結束,是編程的禁忌。忌。C/C+程序設計程序設計11 必須至少有一個必須至少有一個catch塊緊隨塊緊隨try塊之后,兩者之間不
15、能塊之后,兩者之間不能插入其它的語句。一個插入其它的語句。一個try塊可以帶多個塊可以帶多個catch塊,多個塊,多個catch處理器的入口形參其類名在重載的含義上必須是無歧處理器的入口形參其類名在重載的含義上必須是無歧義的。義的。 異常處理的語法異常處理的語法(其中其中type1 ,type2 typen是已聲明的類是已聲明的類型如型如int或或char*等等) 格式為:格式為: try 內(nèi)嵌若干內(nèi)嵌若干throw 語句的語句序列;語句的語句序列; catch (type1 e1) 語句塊語句塊1; catch (type2 e2) 語句塊語句塊2; catch (typen en) 語句塊
16、語句塊n; catch (.) 匹配任意類型的語句塊匹配任意類型的語句塊; 隨后語句隨后語句; C/C+程序設計程序設計12 如上的異常處理可稱為如上的異常處理可稱為trycatch控制結構,這個控制控制結構,這個控制結構就像結構就像ifelse控制結構是正常流程的一部分??刂平Y構是正常流程的一部分。catch塊中塊中方括號括起來的表達式方括號括起來的表達式e1,e2,en表示可選項。表示可選項。 流程通過正常次序進入流程通過正常次序進入try塊,有選擇地觸發(fā)一個塊,有選擇地觸發(fā)一個catch塊的運行。塊的運行。 流程的路由機制是:流程的路由機制是: 首先檢查觸發(fā)首先檢查觸發(fā)throw語句所在
17、的函語句所在的函數(shù),確定數(shù),確定throw隸屬的隸屬的try塊,如果這一步成功,則根據(jù)塊,如果這一步成功,則根據(jù)throw之后的表達式推演出其類型,用這個類型與之后的表達式推演出其類型,用這個類型與try塊管轄塊管轄的的catch塊根據(jù)其先后出現(xiàn)的次序比較,如果探查到與對口塊根據(jù)其先后出現(xiàn)的次序比較,如果探查到與對口的的catch塊類型相吻合,則流程控制交給這個塊類型相吻合,則流程控制交給這個catch塊。省略塊。省略號形式的號形式的catch捕獲處理器放置在最后,以免屏蔽其后的捕獲處理器放置在最后,以免屏蔽其后的catch塊。塊。C/C+程序設計程序設計13 如果一個異常得到成功的捕獲處理且
18、程序沒有終止,則如果一個異常得到成功的捕獲處理且程序沒有終止,則執(zhí)行執(zhí)行trycatch控制結構之后的語句??刂平Y構之后的語句。 同樣如果同樣如果try塊的語句全部遍歷并無塊的語句全部遍歷并無throw語句喚醒,流語句喚醒,流程無視所有的程無視所有的catch塊,塊, 直接跳到直接跳到trycatch控制結構的隨后語句繼續(xù)執(zhí)行??刂平Y構的隨后語句繼續(xù)執(zhí)行。 如果觸動了如果觸動了throw語句拋出一個類型信息流,而沒有相語句拋出一個類型信息流,而沒有相應的應的catch捕獲器予以化解,則企圖啟動捕獲器予以化解,則企圖啟動terminate函數(shù),該函數(shù),該函數(shù)調用函數(shù)調用abort函數(shù),程序非正常
19、地退出,這種退出可引發(fā)函數(shù),程序非正常地退出,這種退出可引發(fā)運行錯誤。運行錯誤。C/C+程序設計程序設計14 下面的例子一個是異常處理另一個是簡單的下面的例子一個是異常處理另一個是簡單的if語句加靜語句加靜態(tài)變量的跟蹤,兩者實現(xiàn)相同的功能。態(tài)變量的跟蹤,兩者實現(xiàn)相同的功能。 程序員的自行跟蹤技術代碼略微復雜,但執(zhí)行文件短小程序員的自行跟蹤技術代碼略微復雜,但執(zhí)行文件短小精悍精悍, 其其debug和和release版本大小分別為版本大小分別為153kb,28kb 。異。異常處理的界面統(tǒng)一但執(zhí)行文件的負擔增添許多,其常處理的界面統(tǒng)一但執(zhí)行文件的負擔增添許多,其debug和和release版本大小分
20、別為版本大小分別為161kb,32kb。 編譯器在幕后進行了復雜的跟蹤、堆棧消息過濾等通用編譯器在幕后進行了復雜的跟蹤、堆棧消息過濾等通用的異常處理,因此代價是不可避免的。的異常處理,因此代價是不可避免的。 資料顯示異常機制導致的時間代價為資料顯示異常機制導致的時間代價為5%,空間大小為,空間大小為%7左右。左右。C/C+程序設計程序設計15例例 C+異常處理技術異常處理技術# include long DivThrow (long x, long y) if (y=0) throw x;return x/y;void ExceptHanding (long u,long v) try lon
21、g d=DivThrow (u,v); printf (ExceptHanding %d/%d=%dn,u,v,d); C/C+程序設計程序設計16catch (long x) printf (ExceptHanding=%d. Cant divided by zeron,x); void main() ExceptHanding(5,3); ExceptHanding(5,0); C/C+程序設計程序設計17例例 if語句加靜態(tài)變量的跟蹤語句加靜態(tài)變量的跟蹤# include enum NoZero=1,IsZero=1000 ; static int sTrace=NoZero; long
22、 DivideIf (long x,long y) if (y=0) sTrace=IsZero; return x; return x/y; C/C+程序設計程序設計18void TraceHanding (long u,long v) long d=DivideIf (u,v);switch (sTrace) case NoZero: printf (TraceHanding %d/%d=%dn,u,v,d);break; case IsZero: printf (TraceHanding %d. Cant divided by zeron,d); break; void main() T
23、raceHanding (6,2); TraceHanding (2,0); C/C+程序設計程序設計19 C+異常處理并不具備異常發(fā)生后異常處理并不具備異常發(fā)生后,程序的自恢復功能。程序的自恢復功能。 如何實施亡羊補牢的事后補救,程序員依然得小心設置如何實施亡羊補牢的事后補救,程序員依然得小心設置靜態(tài)的或外部的全局變量。靜態(tài)的或外部的全局變量。 在可能冒出不測的程序段之前,保存現(xiàn)場到硬盤,然后在可能冒出不測的程序段之前,保存現(xiàn)場到硬盤,然后通過異常處理的強大功能在合適的地方放置通過異常處理的強大功能在合適的地方放置catch捕獲器,捕獲器,對于最容易萌生的錯誤如求逆失敗等安排相應的對于最容易
24、萌生的錯誤如求逆失敗等安排相應的catch塊在塊在路由的前面,然后及時的予以處理。路由的前面,然后及時的予以處理。 C/C+程序設計程序設計20三、異常的多路捕獲三、異常的多路捕獲 C+異常處理的優(yōu)點在于可以捕獲各種類型信息的異異常處理的優(yōu)點在于可以捕獲各種類型信息的異常,特別是面向對象的異常。常,特別是面向對象的異常。 throw語句可以潛入比所隸屬的語句可以潛入比所隸屬的trycatch函數(shù)更內(nèi)層的函數(shù)更內(nèi)層的被調函數(shù)被調函數(shù),但應保證但應保證throw語句密切匹配同層的語句密切匹配同層的catch塊。塊。C/C+程序設計程序設計21例例 異常的多路捕獲異常的多路捕獲# include e
25、num enumType eChars,eLong, eClass, eUnknown, eSkip ;class ClassE;struct Unknown ;void PolyHanding (int kind) if (kind=eSkip) throw eSkip; try if (kind=eChars) throw string type; if (kind=eLong) throw (long) kind; if (kind=eClass) throw ClassE (); if (kind=eUnknown) throw Unknown(); C/C+程序設計程序設計22 catch (char* s) printf (Except Handler is=%st,s); catch (long
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 綠色辦公環(huán)境中的教室設計
- 綠色環(huán)保理念下的教室空間布局
- 2025年燃料元件破損連續(xù)監(jiān)測儀項目可行性研究報告
- 2025年揉紋機項目可行性研究報告
- 2025年1%育成牛預混料項目可行性研究報告
- 2025至2030年金屬柜項目投資價值分析報告
- 2025年中國裝飾用品市場調查研究報告
- 引力波暴與宇宙早期結構形成-深度研究
- 三維重建中的遮擋處理-深度研究
- 2025年中國鉻高耐蝕性藍白鈍化液市場調查研究報告
- 加油站廉潔培訓課件
- 2022版義務教育(生物學)課程標準(附課標解讀)
- 2023屆上海市松江區(qū)高三下學期二模英語試題(含答案)
- 誡子書教案一等獎誡子書教案
- 《民航服務溝通技巧》教案第16課民航服務人員平行溝通的技巧
- 深圳市物業(yè)專項維修資金管理系統(tǒng)操作手冊(電子票據(jù))
- 2023年鐵嶺衛(wèi)生職業(yè)學院高職單招(數(shù)學)試題庫含答案解析
- 起重機械安裝吊裝危險源辨識、風險評價表
- 華北理工兒童口腔醫(yī)學教案06兒童咬合誘導
- 中國建筑項目管理表格
- 高一3班第一次月考總結班會課件
評論
0/150
提交評論