C++的異常處理和空間命名_第1頁(yè)
C++的異常處理和空間命名_第2頁(yè)
C++的異常處理和空間命名_第3頁(yè)
C++的異常處理和空間命名_第4頁(yè)
C++的異常處理和空間命名_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論