




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(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異常處理概述
編譯時(shí)的錯(cuò)誤程序中常見的錯(cuò)誤運(yùn)行時(shí)的錯(cuò)誤。
編譯時(shí)的錯(cuò)誤:
主要是語法錯(cuò)誤,如關(guān)鍵字拼寫錯(cuò)誤、語句末尾缺分號(hào)、括號(hào)不匹配等。這類錯(cuò)誤相對(duì)比較容易修正。
運(yùn)行時(shí)的錯(cuò)誤:
﹡有些是不可預(yù)料的,如算法出錯(cuò);
﹡有些可以預(yù)料但卻無法避免,如內(nèi)存空間不夠,無法實(shí)現(xiàn)指定的操作等;無法打開文件、數(shù)組下標(biāo)越界等。
這類錯(cuò)誤比較隱蔽,不易被發(fā)現(xiàn)。
程序在運(yùn)行過程中出現(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)用程序需要,但無法保證程序的可靠運(yùn)行,而且采用判斷或分支語句處理異常的方法不適合大量異常的處理,更不能處理不可預(yù)知的異常。
傳統(tǒng)的異常處理方法基本上是采取判斷或分支語句來實(shí)現(xiàn)。
410.1.2異常處理的方法
C++處理異常的辦法是:
如果在執(zhí)行一個(gè)函數(shù)過程中出現(xiàn)異常,不在本函數(shù)中立即處理,而是發(fā)出一個(gè)信息,傳給它的上一級(jí)(即調(diào)用函數(shù))來解決,如果上一級(jí)函數(shù)也不能處理,就再傳給其上一級(jí),由其上一級(jí)處理。如此逐級(jí)上傳,如果到最高一級(jí)還無法處理,則終止程序的運(yùn)行。
C++處理異常的機(jī)制是由檢查、拋出和捕獲三個(gè)部分組成,分別由三種語句來完成:
try(檢查)
throw(拋出)catch(捕獲)51.異常的拋出拋出異常使用throw語句,其格式如下:
“表達(dá)式”是表示拋出的異常類型,異常類型由表達(dá)式的類型來表示。例如,含有throw語句的函數(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í),語句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,錯(cuò)誤!"<<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,錯(cuò)誤!"<<endl;}//進(jìn)行異常處理的復(fù)合語句
cout<<"end"<<endl;return0;}intDiv(intx,inty){if(y==0)
throwy;
//拋出異常,當(dāng)除數(shù)y為0時(shí),//語句throw將拋出int型異常
returnx/y;}//當(dāng)除數(shù)y不為0時(shí),返回x/y的值程序運(yùn)行結(jié)果如下:7/3=2除數(shù)為0,錯(cuò)誤!end9說明:
(1)被檢測(cè)的語句或程序段必須放在try塊中,否則不起作用。
(2)try和catch塊中必須有用花括號(hào)括起來的復(fù)合語句,即使花括號(hào)內(nèi)只有一個(gè)語句也不能省略花括號(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ù)合語句
catch(double)//捕獲異常,異常類型是double型
{cout<<"異常發(fā)生!雙精度型!"<<endl;}//進(jìn)行異常處理的復(fù)合語句
cout<<"end"<<endl;return0;}
程序運(yùn)行結(jié)果如下:異常發(fā)生!雙精度型!end11
(4)如果在catch子句中沒有指定異常信息的類型,而用了刪節(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ù)合語句
catch(…)
//捕獲異常,異常類型是任意類型
{cout<<"任意類型異常!"<<endl;}//進(jìn)行異常處理的復(fù)合語句
cout<<"end"<<endl;return0;}程序運(yùn)行結(jié)果如下:任意類型異常!end12
(5)在某種情況下,在throw語句中可以不包括表達(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輸入三角形的三條邊長,求三角形的面積。當(dā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;//語句throw拋出double型異常
returnsqrt(s*(s-a)*(s-b)*(s-c));}14intmain(){doublea,b,c;try//檢查異常{cout<<"請(qǐng)輸入三角形的三個(gè)邊長(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<<"請(qǐng)輸入三角形的三個(gè)邊長(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<<"請(qǐng)輸入三角形的三個(gè)邊長(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<<"請(qǐng)輸入三角形的三個(gè)邊長(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é)果如下:請(qǐng)輸入三角形的三個(gè)邊長(a、b、c):345↙a=3,b=4,c=5三角形的面積=6請(qǐng)輸入三角形的三個(gè)邊長(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ù)和類,放在不同的頭文件中。有可能在不同的頭文件中用了相同名字來定義的函數(shù)或類。這樣在程序中就會(huì)出現(xiàn)命名沖突,就會(huì)引起程序出錯(cuò)。另外,如果在程序中用到第三方的庫,也容易產(chǎn)生同樣的問題。為了解決這一問題,ANSIC++引入了命名空間,用來處理程序中常見的同名沖突問題。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è)簡單變量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;”語句。例如:
#include<iostream>
usingnamespacestd;intmain(){cout<<”WelcometoC++!”<<endl;return0;}21(2)在該標(biāo)識(shí)符前面加上命名空間及作用域運(yùn)算符“::”。例如:
#include<iostream>intmain(){std::cout<<”WelcometoC++!”<<std::endl;return0;}說明:由于C++的早期版本中沒有命名空間的概念,庫中的有關(guān)內(nè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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電玩競(jìng)技桌與座椅出租考核試卷
- 游戲美術(shù)風(fēng)格與視覺傳達(dá)考核試卷
- 磚瓦制造機(jī)械的能效優(yōu)化考核試卷
- 砼結(jié)構(gòu)構(gòu)件的預(yù)制與現(xiàn)澆結(jié)合技術(shù)考核試卷
- 窗簾行業(yè)法律法規(guī)與標(biāo)準(zhǔn)考核試卷
- 溫州大學(xué)《美術(shù)教師職業(yè)技能訓(xùn)練》2023-2024學(xué)年第二學(xué)期期末試卷
- 遼寧省遼陽市2024-2025學(xué)年高三第二學(xué)期3月第一次測(cè)試化學(xué)試題含解析
- 山東省聊城市莘縣第一中學(xué)2025屆全國新高三下學(xué)期開學(xué)大聯(lián)考試題生物試題含解析
- 遼寧省鞍山市第二十六中學(xué)2025年初三模擬檢測(cè)試題(一)物理試題含解析
- 南寧師范大學(xué)師園學(xué)院《Hadoop+spark大數(shù)據(jù)分析技術(shù)課程設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年中國鹽業(yè)股份有限公司招聘筆試參考題庫含答案解析
- 2025年四川省攀枝花市米易縣人才引進(jìn)80人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 眼科檢查-教學(xué)課件
- 亞硝酸鹽中毒的護(hù)理查房
- 離婚協(xié)議書格式范文樣本2025年
- 八下歷史期中復(fù)習(xí)提綱晨讀晚誦+基礎(chǔ)知識(shí)默寫(1-11課) - 2023-2024學(xué)年八年級(jí)歷史下學(xué)期期中考點(diǎn)大串講(統(tǒng)編版)
- 游戲情感化設(shè)計(jì)研究-洞察分析
- 食堂盒飯配送方案(5篇)
- 網(wǎng)格員安全培訓(xùn)
- Environmental Biotechnology知到智慧樹章節(jié)測(cè)試課后答案2024年秋哈爾濱工業(yè)大學(xué)
- 華中師范大學(xué)教育技術(shù)學(xué)碩士研究生培養(yǎng)方案
評(píng)論
0/150
提交評(píng)論