版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
第10章異常處理和命名空間
10.1異常處理
10.2命名空間和頭文件命名規(guī)則
本章主要內(nèi)容1
10.1異常處理
10.1.1異常處理概述
10.1.2異常處理的方法
本節(jié)主要內(nèi)容210.1異常處理10.1.1異常處理概述
編譯時的錯誤程序中常見的錯誤運行時的錯誤。
編譯時的錯誤:
主要是語法錯誤,如關(guān)鍵字拼寫錯誤、語句末尾缺分號、括號不匹配等。這類錯誤相對比較容易修正。
運行時的錯誤:
﹡有些是不可預料的,如算法出錯;
﹡有些可以預料但卻無法避免,如內(nèi)存空間不夠,無法實現(xiàn)指定的操作等;無法打開文件、數(shù)組下標越界等。
這類錯誤比較隱蔽,不易被發(fā)現(xiàn)。
程序在運行過程中出現(xiàn)的錯誤統(tǒng)稱為異常,對異常的處理稱為異常處理。3例10.1傳統(tǒng)的異常處理方法舉例。#include<iostream>usingnamespacestd;intDiv(intx,inty);//函數(shù)Div的原型intmain(){cout<<"7/3=
"<<Div(7,3)<<endl;cout<<"5/0=
"<<Div(5,0)<<endl;return0;}intDiv(intx,inty)//定義函數(shù)Div{if(y==0){cout<<"除數(shù)為0,錯誤!"<<endl;exit(0);}returnx/y;}
程序運行結(jié)果如下:7/3=2
除數(shù)為0,錯誤!
傳統(tǒng)的異常處理方法可以滿足小型的應用程序需要,但無法保證程序的可靠運行,而且采用判斷或分支語句處理異常的方法不適合大量異常的處理,更不能處理不可預知的異常。
傳統(tǒng)的異常處理方法基本上是采取判斷或分支語句來實現(xiàn)。
410.1.2異常處理的方法
C++處理異常的辦法是:
如果在執(zhí)行一個函數(shù)過程中出現(xiàn)異常,不在本函數(shù)中立即處理,而是發(fā)出一個信息,傳給它的上一級(即調(diào)用函數(shù))來解決,如果上一級函數(shù)也不能處理,就再傳給其上一級,由其上一級處理。如此逐級上傳,如果到最高一級還無法處理,則終止程序的運行。
C++處理異常的機制是由檢查、拋出和捕獲三個部分組成,分別由三種語句來完成:
try(檢查)
throw(拋出)catch(捕獲)51.異常的拋出拋出異常使用throw語句,其格式如下:
“表達式”是表示拋出的異常類型,異常類型由表達式的類型來表示。例如,含有throw語句的函數(shù)Div可寫成:
intDiv(intx,inty){if(y==0)
throwy;
returnx/y;//當除數(shù)y不為0時,返回x/y的值
}
由于變量y的類型是int,所以當除數(shù)y為0時,語句throw將拋出int型異常。該異常將由與之匹配的catch語句來捕獲。throw表達式;62.異常的檢查和捕獲異常的檢查和捕獲使用try語句和catch語句,格式如式:try{被檢查的復合語句}catch(異常類型聲明1){進行異常處理的復合語句1}catch(異常類型聲明2){進行異常處理的復合語句2}...catch(異常類型聲明n){進行異常處理的復合語句n}7
例如,用于處理除數(shù)為零異常的try_catch語句如下:
try//檢查異常
{cout<<"7/3"<<Div(7,3)<<endl;//被檢查的復合語句
cout<<"5/0"<<Div(5,0)<<endl;
}catch(int)//捕獲異常,異常類型是int型
{cout<<"除數(shù)為0,錯誤!"<<endl;//進行異常處理的復合語句
}
8例10.2處理除數(shù)為零異常的程序。#include<iostream>usingnamespacestd;intDiv(intx,inty);//函數(shù)Div的原型intmain(){try
//檢查異常
{cout<<"7/3="<<Div(7,3)<<endl;//被檢查的復合語句
cout<<"5/0="<<Div(5,0)<<endl;}
catch(int)
//捕獲異常,異常類型是int型
{cout<<"除數(shù)為0,錯誤!"<<endl;}//進行異常處理的復合語句
cout<<"end"<<endl;return0;}intDiv(intx,inty){if(y==0)
throwy;
//拋出異常,當除數(shù)y為0時,//語句throw將拋出int型異常
returnx/y;}//當除數(shù)y不為0時,返回x/y的值程序運行結(jié)果如下:7/3=2除數(shù)為0,錯誤!end9說明:
(1)被檢測的語句或程序段必須放在try塊中,否則不起作用。
(2)try和catch塊中必須有用花括號括起來的復合語句,即使花括號內(nèi)只有一個語句也不能省略花括號。
(3)一個try_catch結(jié)構(gòu)中只能有一個try塊,但卻可以有多個catch塊,以便與不同的異常信息匹配。
catch后面的括號中,一般只寫異常信息的類型名。10例10.3有多個catch塊的異常處理程序。#include<iostream>usingnamespacestd;intmain(){doublea=2.5;
try//檢查異常
{throwa;}//拋出異常
catch(int)//捕獲異常,異常類型是int型
{cout<<"異常發(fā)生!整數(shù)型!"<<endl;}//進行異常處理的復合語句
catch(double)//捕獲異常,異常類型是double型
{cout<<"異常發(fā)生!雙精度型!"<<endl;}//進行異常處理的復合語句
cout<<"end"<<endl;return0;}
程序運行結(jié)果如下:異常發(fā)生!雙精度型!end11
(4)如果在catch子句中沒有指定異常信息的類型,而用了刪節(jié)號“…”,則表示它可以捕獲任何類型的異常信息。例10.4有刪節(jié)號“…”的異常處理程序。#include<iostream>usingnamespacestd;voidfunc(intx){if(x)
throwx;}//拋出異常,throw拋出整型異常intmain(){try//檢查異常
{func(5);cout<<"Nohere!"<<endl;}//被檢查的復合語句
catch(…)
//捕獲異常,異常類型是任意類型
{cout<<"任意類型異常!"<<endl;}//進行異常處理的復合語句
cout<<"end"<<endl;return0;}程序運行結(jié)果如下:任意類型異常!end12
(5)在某種情況下,在throw語句中可以不包括表達式,如:
throw;
此時它將把當前正在處理的異常信息再次拋出,給其上一層的catch塊處理。
(6)C++中,一旦拋出一個異常,而程序又不捕獲的話,那么系統(tǒng)就會調(diào)用一個系統(tǒng)函數(shù)terminate,由它調(diào)用abort終止程序。13
例10.5輸入三角形的三條邊長,求三角形的面積。當輸入邊的長度小于或等于0,或者當三條邊都大于0,但不能構(gòu)成三角形時,分別拋出異常,結(jié)束程序運行。#include<iostream>#include<cmath>usingnamespacestd;doubletriangle(doublea,doubleb,doublec){doubles=(a+b+c)/2;//三角形面積計算函數(shù)
if(a+b<=c||b+c<=a||c+a<=b)throw1.0;//語句throw拋出double型異常
returnsqrt(s*(s-a)*(s-b)*(s-c));}14intmain(){doublea,b,c;try//檢查異常{cout<<"請輸入三角形的三個邊長(a、b、c):"<<endl;cin>>a>>b>>c;
if(a<=0||b<=0||c<=0)throw1;//語句throw拋出int型異常
while(a>0&&b>0&&c>0){cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;cout<<"三角形的面積="<<triangle(a,b,c)<<endl;cout<<"請輸入三角形的三個邊長(a、b、c):"<<endl;cin>>a>>b>>c;
if(a<=0||b<=0||c<=0)throw1;//語句throw拋出int型異常
}}catch(double)//捕獲異常,異常類型是double型{cout<<"這三條邊不能構(gòu)成三角形,異常發(fā)生,結(jié)束!"<<endl;}catch(int)//捕獲異常,異常類型是int型{cout<<"邊長小于或等于0,異常發(fā)生,結(jié)束!"<<endl;}return0;}15intmain(){doublea,b,c;try//檢查異常{cout<<"請輸入三角形的三個邊長(a、b、c):"<<endl;cin>>a>>b>>c;if(a<=0||b<=0||c<=0)throw1;//語句throw拋出int型異常
while(a>0&&b>0&&c>0){cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;cout<<"三角形的面積="<<triangle(a,b,c)<<endl;cout<<"請輸入三角形的三個邊長(a、b、c):"<<endl;cin>>a>>b>>c;
if(a<=0||b<=0||c<=0)throw1;}}//語句throw拋出int型異常catch(double)//捕獲異常,異常類型是double型{cout<<"這三條邊不能構(gòu)成三角形,異常發(fā)生,結(jié)束!"<<endl;}catch(int)//捕獲異常,異常類型是int型{cout<<"邊長小于或等于0,異常發(fā)生,結(jié)束!"<<endl;}return0;}程序運行結(jié)果如下:請輸入三角形的三個邊長(a、b、c):345↙a=3,b=4,c=5三角形的面積=6請輸入三角形的三個邊長(a、b、c):224↙a=2,b=2,c=4這三條邊不能構(gòu)成三角形,異常發(fā)生,結(jié)束!16
10.2命名空間和頭文件命名規(guī)則
10.2.1命名空間
10.2.2頭文件命名規(guī)則
本節(jié)主要內(nèi)容1710.2.1命名空間
*為什么要引入命名空間一個大型軟件通常是由多人合作完成的,不同的人分別完成不同的模塊。不同的人分別定義了函數(shù)和類,放在不同的頭文件中。有可能在不同的頭文件中用了相同名字來定義的函數(shù)或類。這樣在程序中就會出現(xiàn)命名沖突,就會引起程序出錯。另外,如果在程序中用到第三方的庫,也容易產(chǎn)生同樣的問題。為了解決這一問題,ANSIC++引入了命名空間,用來處理程序中常見的同名沖突問題。18
*什么是命名空間所謂命名空間,實際上就是一個由程序設計者命名的內(nèi)存區(qū)域。程序設計者可以根據(jù)需要指定一些有名字的命名空間,將各命名空間中聲明的標識符與該命名空間標識符建立關(guān)聯(lián),保正不同命名空間的同名標識符不發(fā)生沖突。19
*聲明命名空間的方法
在命名空間NS中定義了兩個簡單變量i和j:
namespaceNS{inti=5;intj=10;}
C++中命名空間的作用類似于操作系統(tǒng)中的目錄和文件的關(guān)系,不同子目錄中的文件可以同名。調(diào)用文件時應指出文件路徑。namespace是定義命名空間的所必須寫的關(guān)鍵字NS是用戶自己指定的命名空間的名字
花括號內(nèi)是命名空間的作用域20
*標準命名空間std
除了用戶可以聲明自己的命名空間外,C++還定義了一個標準命名空間std。
usingnamespacestd;其含義就是使用標準命名空間std。
*標準命名空間std的使用方法
(1)在源文件中使用“usingnamespacestd;”語句。例如:
#include<iostream>
usingnamespacestd;intmain(){cout<<”WelcometoC++!”<<endl;return0;}21(2)在該標識符前面加上命名空間及作用域運算符“::”。例如:
#include<iostream>intmain(){std::cout<<”WelcometoC++!”<<std::endl;return0;}說明:由于C++的早期版本中沒有命名空間的概念,庫中的有關(guān)內(nèi)容也沒有放在std命名空間中,因而在程序中不必對std進行聲明。但是,用標準的C++編程是應該對命名空間std的成員進行聲明或限定的。22例10.6命名空間的使用舉例。#include<iostream>namespaceUniversity//聲明命名空間,名為University{intgrade=3;}namespaceHighschool//聲明命名空間,名為Highschool{intgrade=4;}intmain(){std::cout<<"Theunversity'sgradeis:"<<University::grade<<std
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生物標志物在藥物臨床試驗中的臨床實踐
- 生物支架的生物活性因子負載策略
- 生物化學代謝通路圖示化教學策略
- 生物制品穩(wěn)定性試驗監(jiān)管要求與合規(guī)要點
- 生物制劑臨床試驗中細胞因子風暴監(jiān)測策略-1
- 生物制劑TDM指導IBD患者個體化給藥方案制定
- 航空地勤崗技能考試大綱及試題解析
- 汽車行業(yè)招聘專員面試題及答案
- 網(wǎng)絡直播平臺的項目總監(jiān)應聘題目詳解
- 導電性能測定儀建設項目可行性分析報告(總投資7000萬元)
- 河北省職業(yè)院?!叭肆Y源服務”技能大賽(高職組)參考試題庫(含答案)
- 院感知識培訓內(nèi)容超聲室課件
- 老果園改造申請書
- 2025年無犯罪記錄證明申請表申請書(模板)
- 保險核心系統(tǒng)(承保、理賠)中斷應急預案
- 2025年石嘴山市政務服務中心(綜合窗口)人員招聘筆試備考試題及答案解析
- 書記員的考試試題及答案
- 退股協(xié)議解除合同書范本
- 臺球桿買賣交易合同范本
- (2025年標準)演出免責協(xié)議書
- 2025年江西省公安機關(guān)人民警察特殊職位招錄考試(網(wǎng)絡安全)歷年參考題庫含答案詳解(5卷)
評論
0/150
提交評論