![C++的異常處理和空間命名_第1頁(yè)](http://file4.renrendoc.com/view/b5da9c7a47eae4d3547e89a422cf6bfe/b5da9c7a47eae4d3547e89a422cf6bfe1.gif)
![C++的異常處理和空間命名_第2頁(yè)](http://file4.renrendoc.com/view/b5da9c7a47eae4d3547e89a422cf6bfe/b5da9c7a47eae4d3547e89a422cf6bfe2.gif)
![C++的異常處理和空間命名_第3頁(yè)](http://file4.renrendoc.com/view/b5da9c7a47eae4d3547e89a422cf6bfe/b5da9c7a47eae4d3547e89a422cf6bfe3.gif)
![C++的異常處理和空間命名_第4頁(yè)](http://file4.renrendoc.com/view/b5da9c7a47eae4d3547e89a422cf6bfe/b5da9c7a47eae4d3547e89a422cf6bfe4.gif)
![C++的異常處理和空間命名_第5頁(yè)](http://file4.renrendoc.com/view/b5da9c7a47eae4d3547e89a422cf6bfe/b5da9c7a47eae4d3547e89a422cf6bfe5.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎ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異常處理概述
編譯時(shí)的錯(cuò)誤程序中常見(jiàn)的錯(cuò)誤運(yùn)行時(shí)的錯(cuò)誤。
編譯時(shí)的錯(cuò)誤:
主要是語(yǔ)法錯(cuò)誤,如關(guān)鍵字拼寫錯(cuò)誤、語(yǔ)句末尾缺分號(hào)、括號(hào)不匹配等。這類錯(cuò)誤相對(duì)比較容易修正。
運(yùn)行時(shí)的錯(cuò)誤:
﹡有些是不可預(yù)料的,如算法出錯(cuò);
﹡有些可以預(yù)料但卻無(wú)法避免,如內(nèi)存空間不夠,無(wú)法實(shí)現(xiàn)指定的操作等;無(wú)法打開文件、數(shù)組下標(biāo)越界等。
這類錯(cuò)誤比較隱蔽,不易被發(fā)現(xiàn)。
程序在運(yùn)行過(guò)程中出現(xiàn)的錯(cuò)誤統(tǒng)稱為異常,對(duì)異常的處理稱為異常處理。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,錯(cuò)誤!"<<endl;exit(0);}returnx/y;}
程序運(yùn)行結(jié)果如下:7/3=2
除數(shù)為0,錯(cuò)誤!
傳統(tǒng)的異常處理方法可以滿足小型的應(yīng)用程序需要,但無(wú)法保證程序的可靠運(yùn)行,而且采用判斷或分支語(yǔ)句處理異常的方法不適合大量異常的處理,更不能處理不可預(yù)知的異常。
傳統(tǒng)的異常處理方法基本上是采取判斷或分支語(yǔ)句來(lái)實(shí)現(xiàn)。
410.1.2異常處理的方法
C++處理異常的辦法是:
如果在執(zhí)行一個(gè)函數(shù)過(guò)程中出現(xiàn)異常,不在本函數(shù)中立即處理,而是發(fā)出一個(gè)信息,傳給它的上一級(jí)(即調(diào)用函數(shù))來(lái)解決,如果上一級(jí)函數(shù)也不能處理,就再傳給其上一級(jí),由其上一級(jí)處理。如此逐級(jí)上傳,如果到最高一級(jí)還無(wú)法處理,則終止程序的運(yùn)行。
C++處理異常的機(jī)制是由檢查、拋出和捕獲三個(gè)部分組成,分別由三種語(yǔ)句來(lái)完成:
try(檢查)
throw(拋出)catch(捕獲)51.異常的拋出拋出異常使用throw語(yǔ)句,其格式如下:
“表達(dá)式”是表示拋出的異常類型,異常類型由表達(dá)式的類型來(lái)表示。例如,含有throw語(yǔ)句的函數(shù)Div可寫成:
intDiv(intx,inty){if(y==0)
throwy;
returnx/y;//當(dāng)除數(shù)y不為0時(shí),返回x/y的值
}
由于變量y的類型是int,所以當(dāng)除數(shù)y為0時(shí),語(yǔ)句throw將拋出int型異常。該異常將由與之匹配的catch語(yǔ)句來(lái)捕獲。throw表達(dá)式;62.異常的檢查和捕獲異常的檢查和捕獲使用try語(yǔ)句和catch語(yǔ)句,格式如式:try{被檢查的復(fù)合語(yǔ)句}catch(異常類型聲明1){進(jìn)行異常處理的復(fù)合語(yǔ)句1}catch(異常類型聲明2){進(jìn)行異常處理的復(fù)合語(yǔ)句2}...catch(異常類型聲明n){進(jìn)行異常處理的復(fù)合語(yǔ)句n}7
例如,用于處理除數(shù)為零異常的try_catch語(yǔ)句如下:
try//檢查異常
{cout<<"7/3"<<Div(7,3)<<endl;//被檢查的復(fù)合語(yǔ)句
cout<<"5/0"<<Div(5,0)<<endl;
}catch(int)//捕獲異常,異常類型是int型
{cout<<"除數(shù)為0,錯(cuò)誤!"<<endl;//進(jìn)行異常處理的復(fù)合語(yǔ)句
}
8例10.2處理除數(shù)為零異常的程序。#include<iostream>usingnamespacestd;intDiv(intx,inty);//函數(shù)Div的原型intmain(){try
//檢查異常
{cout<<"7/3="<<Div(7,3)<<endl;//被檢查的復(fù)合語(yǔ)句
cout<<"5/0="<<Div(5,0)<<endl;}
catch(int)
//捕獲異常,異常類型是int型
{cout<<"除數(shù)為0,錯(cuò)誤!"<<endl;}//進(jìn)行異常處理的復(fù)合語(yǔ)句
cout<<"end"<<endl;return0;}intDiv(intx,inty){if(y==0)
throwy;
//拋出異常,當(dāng)除數(shù)y為0時(shí),//語(yǔ)句throw將拋出int型異常
returnx/y;}//當(dāng)除數(shù)y不為0時(shí),返回x/y的值程序運(yùn)行結(jié)果如下:7/3=2除數(shù)為0,錯(cuò)誤!end9說(shuō)明:
(1)被檢測(cè)的語(yǔ)句或程序段必須放在try塊中,否則不起作用。
(2)try和catch塊中必須有用花括號(hào)括起來(lái)的復(fù)合語(yǔ)句,即使花括號(hào)內(nèi)只有一個(gè)語(yǔ)句也不能省略花括號(hào)。
(3)一個(gè)try_catch結(jié)構(gòu)中只能有一個(gè)try塊,但卻可以有多個(gè)catch塊,以便與不同的異常信息匹配。
catch后面的括號(hào)中,一般只寫異常信息的類型名。10例10.3有多個(gè)catch塊的異常處理程序。#include<iostream>usingnamespacestd;intmain(){doublea=2.5;
try//檢查異常
{throwa;}//拋出異常
catch(int)//捕獲異常,異常類型是int型
{cout<<"異常發(fā)生!整數(shù)型!"<<endl;}//進(jìn)行異常處理的復(fù)合語(yǔ)句
catch(double)//捕獲異常,異常類型是double型
{cout<<"異常發(fā)生!雙精度型!"<<endl;}//進(jìn)行異常處理的復(fù)合語(yǔ)句
cout<<"end"<<endl;return0;}
程序運(yùn)行結(jié)果如下:異常發(fā)生!雙精度型!end11
(4)如果在catch子句中沒(méi)有指定異常信息的類型,而用了刪節(jié)號(hào)“…”,則表示它可以捕獲任何類型的異常信息。例10.4有刪節(jié)號(hào)“…”的異常處理程序。#include<iostream>usingnamespacestd;voidfunc(intx){if(x)
throwx;}//拋出異常,throw拋出整型異常intmain(){try//檢查異常
{func(5);cout<<"Nohere!"<<endl;}//被檢查的復(fù)合語(yǔ)句
catch(…)
//捕獲異常,異常類型是任意類型
{cout<<"任意類型異常!"<<endl;}//進(jìn)行異常處理的復(fù)合語(yǔ)句
cout<<"end"<<endl;return0;}程序運(yùn)行結(jié)果如下:任意類型異常!end12
(5)在某種情況下,在throw語(yǔ)句中可以不包括表達(dá)式,如:
throw;
此時(shí)它將把當(dāng)前正在處理的異常信息再次拋出,給其上一層的catch塊處理。
(6)C++中,一旦拋出一個(gè)異常,而程序又不捕獲的話,那么系統(tǒng)就會(huì)調(diào)用一個(gè)系統(tǒng)函數(shù)terminate,由它調(diào)用abort終止程序。13
例10.5輸入三角形的三條邊長(zhǎng),求三角形的面積。當(dāng)輸入邊的長(zhǎng)度小于或等于0,或者當(dāng)三條邊都大于0,但不能構(gòu)成三角形時(shí),分別拋出異常,結(jié)束程序運(yùn)行。#include<iostream>#include<cmath>usingnamespacestd;doubletriangle(doublea,doubleb,doublec){doubles=(a+b+c)/2;//三角形面積計(jì)算函數(shù)
if(a+b<=c||b+c<=a||c+a<=b)throw1.0;//語(yǔ)句throw拋出double型異常
returnsqrt(s*(s-a)*(s-b)*(s-c));}14intmain(){doublea,b,c;try//檢查異常{cout<<"請(qǐng)輸入三角形的三個(gè)邊長(zhǎng)(a、b、c):"<<endl;cin>>a>>b>>c;
if(a<=0||b<=0||c<=0)throw1;//語(yǔ)句throw拋出int型異常
while(a>0&&b>0&&c>0){cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;cout<<"三角形的面積="<<triangle(a,b,c)<<endl;cout<<"請(qǐng)輸入三角形的三個(gè)邊長(zhǎng)(a、b、c):"<<endl;cin>>a>>b>>c;
if(a<=0||b<=0||c<=0)throw1;//語(yǔ)句throw拋出int型異常
}}catch(double)//捕獲異常,異常類型是double型{cout<<"這三條邊不能構(gòu)成三角形,異常發(fā)生,結(jié)束!"<<endl;}catch(int)//捕獲異常,異常類型是int型{cout<<"邊長(zhǎng)小于或等于0,異常發(fā)生,結(jié)束!"<<endl;}return0;}15intmain(){doublea,b,c;try//檢查異常{cout<<"請(qǐng)輸入三角形的三個(gè)邊長(zhǎng)(a、b、c):"<<endl;cin>>a>>b>>c;if(a<=0||b<=0||c<=0)throw1;//語(yǔ)句throw拋出int型異常
while(a>0&&b>0&&c>0){cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;cout<<"三角形的面積="<<triangle(a,b,c)<<endl;cout<<"請(qǐng)輸入三角形的三個(gè)邊長(zhǎng)(a、b、c):"<<endl;cin>>a>>b>>c;
if(a<=0||b<=0||c<=0)throw1;}}//語(yǔ)句throw拋出int型異常catch(double)//捕獲異常,異常類型是double型{cout<<"這三條邊不能構(gòu)成三角形,異常發(fā)生,結(jié)束!"<<endl;}catch(int)//捕獲異常,異常類型是int型{cout<<"邊長(zhǎng)小于或等于0,異常發(fā)生,結(jié)束!"<<endl;}return0;}程序運(yùn)行結(jié)果如下:請(qǐng)輸入三角形的三個(gè)邊長(zhǎng)(a、b、c):345↙a=3,b=4,c=5三角形的面積=6請(qǐng)輸入三角形的三個(gè)邊長(zhǎng)(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命名空間
*為什么要引入命名空間一個(gè)大型軟件通常是由多人合作完成的,不同的人分別完成不同的模塊。不同的人分別定義了函數(shù)和類,放在不同的頭文件中。有可能在不同的頭文件中用了相同名字來(lái)定義的函數(shù)或類。這樣在程序中就會(huì)出現(xiàn)命名沖突,就會(huì)引起程序出錯(cuò)。另外,如果在程序中用到第三方的庫(kù),也容易產(chǎn)生同樣的問(wèn)題。為了解決這一問(wèn)題,ANSIC++引入了命名空間,用來(lái)處理程序中常見(jiàn)的同名沖突問(wèn)題。18
*什么是命名空間所謂命名空間,實(shí)際上就是一個(gè)由程序設(shè)計(jì)者命名的內(nèi)存區(qū)域。程序設(shè)計(jì)者可以根據(jù)需要指定一些有名字的命名空間,將各命名空間中聲明的標(biāo)識(shí)符與該命名空間標(biāo)識(shí)符建立關(guān)聯(lián),保正不同命名空間的同名標(biāo)識(shí)符不發(fā)生沖突。19
*聲明命名空間的方法
在命名空間NS中定義了兩個(gè)簡(jiǎn)單變量i和j:
namespaceNS{inti=5;intj=10;}
C++中命名空間的作用類似于操作系統(tǒng)中的目錄和文件的關(guān)系,不同子目錄中的文件可以同名。調(diào)用文件時(shí)應(yīng)指出文件路徑。namespace是定義命名空間的所必須寫的關(guān)鍵字NS是用戶自己指定的命名空間的名字
花括號(hào)內(nèi)是命名空間的作用域20
*標(biāo)準(zhǔn)命名空間std
除了用戶可以聲明自己的命名空間外,C++還定義了一個(gè)標(biāo)準(zhǔn)命名空間std。
usingnamespacestd;其含義就是使用標(biāo)準(zhǔn)命名空間std。
*標(biāo)準(zhǔn)命名空間std的使用方法
(1)在源文件中使用“usingnamespacestd;”語(yǔ)句。例如:
#include<iostream>
usingnamespacestd;intmain(){cout<<”WelcometoC++!”<<endl;return0;}21(2)在該標(biāo)識(shí)符前面加上命名空間及作用域運(yùn)算符“::”。例如:
#include<iostream>intmain(){std::cout<<”WelcometoC++!”<<std::endl;return0;}說(shuō)明:由于C++的早期版本中沒(méi)有命名空間的概念,庫(kù)中的有關(guān)內(nèi)容也沒(méi)有放在std命名空間中,因而在程序中不必對(duì)std進(jìn)行聲明。但是,用標(biāo)準(zhǔn)的C++編程是應(yīng)該對(duì)命名空間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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度辦事處知識(shí)產(chǎn)權(quán)專利實(shí)施許可與授權(quán)合同
- 家裝項(xiàng)目監(jiān)管合同
- 二零二五年度辦公室清潔與員工健康關(guān)懷合同
- 農(nóng)產(chǎn)品銷售居間合同委托書
- 有保證人借款合同
- 全新借錢的合同
- 制造業(yè)自動(dòng)化技術(shù)指南
- 醫(yī)院技術(shù)合作協(xié)議
- 工程建設(shè)項(xiàng)目招標(biāo)代理協(xié)議書
- 商標(biāo)權(quán)轉(zhuǎn)讓合同
- 必修3《政治與法治》 選擇題專練50題 含解析-備戰(zhàn)2025年高考政治考試易錯(cuò)題(新高考專用)
- 二零二五版電商企業(yè)兼職財(cái)務(wù)顧問(wèn)雇用協(xié)議3篇
- 課題申報(bào)參考:流視角下社區(qū)生活圈的適老化評(píng)價(jià)與空間優(yōu)化研究-以沈陽(yáng)市為例
- 深圳2024-2025學(xué)年度四年級(jí)第一學(xué)期期末數(shù)學(xué)試題
- 《openEuler操作系統(tǒng)》考試復(fù)習(xí)題庫(kù)(含答案)
- 2024-2025學(xué)年成都市高新區(qū)七年級(jí)上英語(yǔ)期末考試題(含答案)
- 17J008擋土墻(重力式、衡重式、懸臂式)圖示圖集
- 《中南大學(xué)模板》課件
- 廣東省深圳市南山區(qū)2024-2025學(xué)年第一學(xué)期期末考試九年級(jí)英語(yǔ)試卷(含答案)
- T-CISA 402-2024 涂鍍產(chǎn)品 切口腐蝕試驗(yàn)方法
- 后勤安全生產(chǎn)
評(píng)論
0/150
提交評(píng)論