C++Primer筆記——5.語(yǔ)句-創(chuàng)新互聯(lián)

語(yǔ)句 try 語(yǔ)句塊和異常處理

異常是指存在于運(yùn)行時(shí)的反常行為,這些行為超出了函數(shù)的正常功能范圍。

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站制作、做網(wǎng)站、泗洪網(wǎng)絡(luò)推廣、重慶小程序開發(fā)、泗洪網(wǎng)絡(luò)營(yíng)銷、泗洪企業(yè)策劃、泗洪品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供泗洪建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:muchs.cn

當(dāng)程序的某部分檢測(cè)到一個(gè)在它無(wú)法處理的問題時(shí),需要用到異常處理。

異常處理機(jī)制為程序中異常檢測(cè)和異常處理這兩部分的協(xié)作提供支持。

  • throw表達(dá)式(throw expression),異常檢測(cè)部分使用 throw 表達(dá)式來(lái)表示它遇到了無(wú)法處理的問題。我們說 throw 引發(fā)了異常

  • try語(yǔ)句塊(try block),異常處理部分使用 try 語(yǔ)句塊處理異常。try語(yǔ)句塊以 try 關(guān)鍵字開始,并以一個(gè)或多個(gè)catch子句處理。因?yàn)?catch 子句處理異常,所以它們也被稱作異常處理代碼

  • 一套異常類(exception class),用在 throw 表達(dá)式 和 相關(guān)的catch子句之間傳遞異常信息

一、throw 表達(dá)式

程序的異常檢測(cè)部分使用 throw 表達(dá)式引發(fā)一個(gè)異常。

Sales_item item1, item2;

	cin >>item1 >>item2;

	//首先檢查兩條數(shù)據(jù)是否關(guān)于同一種書籍的
	if (item1.isbn() != item2.isbn()) {throw runtime_error("Data must refer to same ISBN");
	}

	//程序如果執(zhí)行到這里表明兩個(gè)isbn是相同的
	cout<< item1 + item2<< endl;

拋出異常將終止當(dāng)前的函數(shù),并把控制權(quán)轉(zhuǎn)移給能處理該異常的代碼。類型runtime_error是標(biāo)準(zhǔn)庫(kù)異常類型的一種,定義在 stdexcept頭文件種。

二、try 語(yǔ)句塊

跟在 try語(yǔ)句塊之后的是一個(gè)或多個(gè)catch子句。當(dāng)選中了某一個(gè)catch子句處理異常之后,執(zhí)行與之對(duì)應(yīng)的塊。catch一旦完成,程序跳轉(zhuǎn)到 try 語(yǔ)句塊最后一個(gè)catch 子句之后的那條語(yǔ)句繼續(xù)執(zhí)行。

1. 編寫處理代碼

其中與用戶交互的代碼負(fù)責(zé)處理發(fā)生的異常,它的形式可能如下:

while (cin >>item1 >>item2) {try {	//執(zhí)行兩個(gè) Sales_item 對(duì)象的代碼
			//如果添加失敗,代碼拋出一個(gè)runtime_error 異常
		}
		catch (runtime_error err) {	//提醒用戶兩個(gè) isbn 必須一致,詢問是否重新輸入
			cout<< err.what()<< "\nTry Again? Enter y or n"<< endl;
			char c;
			cin >>c;
			if (!cin || c == 'n') break;
		}
	}
2. 函數(shù)在尋找處理代碼的過程中退出

尋找處理代碼的過程與函數(shù)調(diào)用鏈剛好相反。當(dāng)異常被拋出時(shí),首先拋出該異常的函數(shù)。如果沒有找到匹配的catch子句,終止該函數(shù),并且在調(diào)用該函數(shù)的函數(shù)中繼續(xù)尋找。如果還是沒有找到匹配的catch子句,這個(gè)新的函數(shù)也被終止,繼續(xù)搜索調(diào)用它的函數(shù)。以此類推,沿著程序的執(zhí)行路徑逐層返回,直到找到適當(dāng)類型的catch子句為止。

如果最終還是沒能找到匹配的catch子句,程序轉(zhuǎn)到名為 terminate的標(biāo)準(zhǔn)庫(kù)函數(shù)。該函數(shù)的行為與系統(tǒng)有關(guān),一般情況下,執(zhí)行該函數(shù)將導(dǎo)致程序非正常退出。

三、標(biāo)準(zhǔn)異常

C++ 標(biāo)準(zhǔn)庫(kù)定義了一組類,用于報(bào)告標(biāo)準(zhǔn)庫(kù)函數(shù)遇到的問題。這些異常類也可以在用戶編寫的程序中使用。

  • exception 頭文件定義了最通用的異常類 exception。它只報(bào)告異常的發(fā)生,不提供任何額外的信息

  • stdexcept 頭文件定義了幾種常用的異常類

  • new 頭文件定了 bad_alloc 異常類型

  • type_info 頭文件定義了 bad_cast 異常類型

stdexcept 定義的異常類

exception最常見的問題
runtime_error只有在運(yùn)行時(shí)才能檢測(cè)出的問題
range_error運(yùn)行錯(cuò)誤:生成的結(jié)果超出了有意義的值域范圍
overflow_error運(yùn)行錯(cuò)誤:計(jì)算上溢
underflow_error運(yùn)行錯(cuò)誤:計(jì)算下溢
logic_error程序邏輯錯(cuò)誤
domain_error邏輯錯(cuò)誤:參數(shù)對(duì)應(yīng)結(jié)果值不存在
invalid_argument邏輯錯(cuò)誤:無(wú)效參數(shù)
length_error邏輯錯(cuò)誤:試圖創(chuàng)建一個(gè)超出該類型大長(zhǎng)度的對(duì)象
out_of_range邏輯錯(cuò)誤:使用一個(gè)超出有效范圍的值

我們只能以默認(rèn)初始化的方式初始化exception,bad_alloc,和 bad_cast 對(duì)象,不允許為這些對(duì)象提供初始值。

異常類型只定義了一個(gè)名為 what 的成員函數(shù),該函數(shù)沒有參數(shù),返回值是一個(gè)指向 C 風(fēng)格字符串的 const char*。該字符串的目的是提供關(guān)于異常的一些基本信息。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)頁(yè)題目:C++Primer筆記——5.語(yǔ)句-創(chuàng)新互聯(lián)
文章URL:http://muchs.cn/article42/degjec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、用戶體驗(yàn)、面包屑導(dǎo)航營(yíng)銷型網(wǎng)站建設(shè)外貿(mào)網(wǎng)站建設(shè)、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化