版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第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異常處理概述
編譯時的錯誤程序中常見的錯誤運(yùn)行時的錯誤。
編譯時的錯誤:
主要是語法錯誤,如關(guān)鍵字拼寫錯誤、語句末尾缺分號、括號不匹配等。這類錯誤相對比較容易修正。
運(yùn)行時的錯誤:
﹡有些是不可預(yù)料的,如算法出錯;
﹡有些可以預(yù)料但卻無法避免,如內(nèi)存空間不夠,無法實(shí)現(xiàn)指定的操作等;無法打開文件、數(shù)組下標(biāo)越界等。
這類錯誤比較隱蔽,不易被發(fā)現(xiàn)。
程序在運(yù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;}
程序運(yùn)行結(jié)果如下:7/3=2
除數(shù)為0,錯誤!
傳統(tǒng)的異常處理方法可以滿足小型的應(yīng)用程序需要,但無法保證程序的可靠運(yùn)行,而且采用判斷或分支語句處理異常的方法不適合大量異常的處理,更不能處理不可預(yù)知的異常。
傳統(tǒng)的異常處理方法基本上是采取判斷或分支語句來實(shí)現(xiàn)。
410.1.2異常處理的方法
C++處理異常的辦法是:
如果在執(zhí)行一個函數(shù)過程中出現(xiàn)異常,不在本函數(shù)中立即處理,而是發(fā)出一個信息,傳給它的上一級(即調(diào)用函數(shù))來解決,如果上一級函數(shù)也不能處理,就再傳給其上一級,由其上一級處理。如此逐級上傳,如果到最高一級還無法處理,則終止程序的運(yùn)行。
C++處理異常的機(jī)制是由檢查、拋出和捕獲三個部分組成,分別由三種語句來完成:
try(檢查)
throw(拋出)catch(捕獲)51.異常的拋出拋出異常使用throw語句,其格式如下:
“表達(dá)式”是表示拋出的異常類型,異常類型由表達(dá)式的類型來表示。例如,含有throw語句的函數(shù)Div可寫成:
intDiv(intx,inty){if(y==0)
throwy;
returnx/y;//當(dāng)除數(shù)y不為0時,返回x/y的值
}
由于變量y的類型是int,所以當(dāng)除數(shù)y為0時,語句throw將拋出int型異常。該異常將由與之匹配的catch語句來捕獲。throw表達(dá)式;62.異常的檢查和捕獲異常的檢查和捕獲使用try語句和catch語句,格式如式:try{被檢查的復(fù)合語句}catch(異常類型聲明1){進(jìn)行異常處理的復(fù)合語句1}catch(異常類型聲明2){進(jìn)行異常處理的復(fù)合語句2}...catch(異常類型聲明n){進(jìn)行異常處理的復(fù)合語句n}7
例如,用于處理除數(shù)為零異常的try_catch語句如下:
try//檢查異常
{cout<<"7/3"<<Div(7,3)<<endl;//被檢查的復(fù)合語句
cout<<"5/0"<<Div(5,0)<<endl;
}catch(int)//捕獲異常,異常類型是int型
{cout<<"除數(shù)為0,錯誤!"<<endl;//進(jìn)行異常處理的復(fù)合語句
}
8例10.2處理除數(shù)為零異常的程序。#include<iostream>usingnamespacestd;intDiv(intx,inty);//函數(shù)Div的原型intmain(){try
//檢查異常
{cout<<"7/3="<<Div(7,3)<<endl;//被檢查的復(fù)合語句
cout<<"5/0="<<Div(5,0)<<endl;}
catch(int)
//捕獲異常,異常類型是int型
{cout<<"除數(shù)為0,錯誤!"<<endl;}//進(jìn)行異常處理的復(fù)合語句
cout<<"end"<<endl;return0;}intDiv(intx,inty){if(y==0)
throwy;
//拋出異常,當(dāng)除數(shù)y為0時,//語句throw將拋出int型異常
returnx/y;}//當(dāng)除數(shù)y不為0時,返回x/y的值程序運(yùn)行結(jié)果如下:7/3=2除數(shù)為0,錯誤!end9說明:
(1)被檢測的語句或程序段必須放在try塊中,否則不起作用。
(2)try和catch塊中必須有用花括號括起來的復(fù)合語句,即使花括號內(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;}//進(jìn)行異常處理的復(fù)合語句
catch(double)//捕獲異常,異常類型是double型
{cout<<"異常發(fā)生!雙精度型!"<<endl;}//進(jìn)行異常處理的復(fù)合語句
cout<<"end"<<endl;return0;}
程序運(yùn)行結(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;}//被檢查的復(fù)合語句
catch(…)
//捕獲異常,異常類型是任意類型
{cout<<"任意類型異常!"<<endl;}//進(jìn)行異常處理的復(fù)合語句
cout<<"end"<<endl;return0;}程序運(yùn)行結(jié)果如下:任意類型異常!end12
(5)在某種情況下,在throw語句中可以不包括表達(dá)式,如:
throw;
此時它將把當(dāng)前正在處理的異常信息再次拋出,給其上一層的catch塊處理。
(6)C++中,一旦拋出一個異常,而程序又不捕獲的話,那么系統(tǒng)就會調(diào)用一個系統(tǒng)函數(shù)terminate,由它調(diào)用abort終止程序。13
例10.5輸入三角形的三條邊長,求三角形的面積。當(dāng)輸入邊的長度小于或等于0,或者當(dāng)三條邊都大于0,但不能構(gòu)成三角形時,分別拋出異常,結(jié)束程序運(yùn)行。#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;}程序運(yùn)行結(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
*什么是命名空間所謂命名空間,實(shí)際上就是一個由程序設(shè)計者命名的內(nèi)存區(qū)域。程序設(shè)計者可以根據(jù)需要指定一些有名字的命名空間,將各命名空間中聲明的標(biāo)識符與該命名空間標(biāo)識符建立關(guān)聯(lián),保正不同命名空間的同名標(biāo)識符不發(fā)生沖突。19
*聲明命名空間的方法
在命名空間NS中定義了兩個簡單變量i和j:
namespaceNS{inti=5;intj=10;}
C++中命名空間的作用類似于操作系統(tǒng)中的目錄和文件的關(guān)系,不同子目錄中的文件可以同名。調(diào)用文件時應(yīng)指出文件路徑。namespace是定義命名空間的所必須寫的關(guān)鍵字NS是用戶自己指定的命名空間的名字
花括號內(nèi)是命名空間的作用域20
*標(biāo)準(zhǔn)命名空間std
除了用戶可以聲明自己的命名空間外,C++還定義了一個標(biāo)準(zhǔn)命名空間std。
usingnamespacestd;其含義就是使用標(biāo)準(zhǔn)命名空間std。
*標(biāo)準(zhǔn)命名空間std的使用方法
(1)在源文件中使用“usingnamespacestd;”語句。例如:
#include<iostream>
usingnamespacestd;intmain(){cout<<”WelcometoC++!”<<endl;return0;}21(2)在該標(biāo)識符前面加上命名空間及作用域運(yùn)算符“::”。例如:
#include<iostream>intmain(){std::cout<<”WelcometoC++!”<<std::endl;return0;}說明:由于C++的早期版本中沒有命名空間的概念,庫中的有關(guān)內(nèi)容也沒有放在std命名空間中,因而在程序中不必對std進(jìn)行聲明。但是,用標(biāo)準(zhǔn)的C++編程是應(yīng)該對命名空間std的成員進(jìn)行聲明或限定的。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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年二零二四年度正規(guī)互聯(lián)網(wǎng)公司勞動合同范本3篇
- 填料在混凝土中的應(yīng)用研究-洞察分析
- 2024年度綠色建筑產(chǎn)業(yè)股權(quán)轉(zhuǎn)讓補(bǔ)償協(xié)議3篇
- 微生物組與衰老進(jìn)程-洞察分析
- 采購合同的價格變動3篇
- 2024年度教育機(jī)構(gòu)教師派遣及教學(xué)資源整合合作協(xié)議3篇
- 采購合同風(fēng)險管理與防范要點(diǎn)3篇
- 采購合同續(xù)簽臺帳3篇
- 采購合同中的國際金融市場3篇
- 采購合同的訂立及與采購方案的關(guān)聯(lián)3篇
- 行政復(fù)議法-形考作業(yè)4-國開(ZJ)-參考資料
- 分離技術(shù)發(fā)展趨勢
- 兒科護(hù)理技術(shù)操作規(guī)范
- 版《公路工程機(jī)械臺班費(fèi)用定額》
- 2024年江蘇宿遷經(jīng)濟(jì)技術(shù)開發(fā)區(qū)城市管理輔助人員招聘筆試參考題庫附帶答案詳解
- 施工環(huán)境保護(hù)方案或措施
- 汽車維修實(shí)施方案
- 陽光少年體驗(yàn)營輔導(dǎo)員工作總結(jié)
- 2024銷售業(yè)績深度總結(jié)報告
- (高清版)DZT 0388-2021 礦區(qū)地下水監(jiān)測規(guī)范
- 【新課標(biāo)】小學(xué)道德與法治課程標(biāo)準(zhǔn)考試試卷
評論
0/150
提交評論