国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

c++教程(二十三: Exceptions)

2019-11-10 23:00:26
字體:
供稿:網(wǎng)友

Exceptions(異常)

Exceptions 異常提供了一種方法來對(duì)程序中的異常情況(如運(yùn)行時(shí)錯(cuò)誤)進(jìn)行響應(yīng),將控制傳遞給稱為handlers處理器的特殊函數(shù)。

若要捕獲異常,則在異常檢查下放置一部分代碼。這是通過在 try-block中封裝代碼部分來實(shí)現(xiàn)的。當(dāng)異常情況出現(xiàn)在該塊中時(shí),會(huì)拋出異常,將控制轉(zhuǎn)移到異常處理程序。如果沒有拋出異常,則代碼將繼續(xù)正常,所有處理程序?qū)⒈缓雎浴?/p>

通過從try 塊內(nèi)部使用拋出關(guān)鍵字引發(fā)異常。使用關(guān)鍵字catch聲明異常處理程序,必須在try 塊之后立即放置:

// exceptions#include <iostream>using namespace std;int main () { try { throw 20; } catch (int e) { cout << "An exception occurred. Exception Nr. " << e << '/n'; } return 0;}結(jié)果為An exception occurred. Exception Nr. 20

異常處理下的代碼包含在一個(gè)try塊中。在這個(gè)例子中,這個(gè)代碼只拋出一個(gè)異常:

throw 20;

throw 表達(dá)式接受一個(gè)參數(shù)(在這種情況下,整型值20),它作為參數(shù)傳遞給異常處理程序。

異常處理程序在try塊的結(jié)束括號(hào)之后立即用catch關(guān)鍵字聲明。catch的語(yǔ)法類似于帶有一個(gè)參數(shù)的正則函數(shù)。此參數(shù)的類型是非常重要的,因?yàn)閷?duì)throw 表達(dá)式傳遞的參數(shù)類型進(jìn)行了檢查,只有在它們匹配的情況下,異常才會(huì)被該處理程序捕獲。

多個(gè)處理程序(即,多catch表達(dá)式)可以被鏈接;每一個(gè)具有不同的參數(shù)類型。只執(zhí)行參數(shù)類型與拋出語(yǔ)句中指定的異常類型相匹配的處理程序。

try { // code here}catch (int param) { cout << "int exception"; }catch (char param) { cout << "char exception"; }catch (...) { cout << "default exception"; }

在這種情況下,最后的處理程序會(huì)拋出的任何異常的類型既不是int也不是 char。 處理程序異常后,執(zhí)行將在嘗試catch塊后恢復(fù),而不是在拋出語(yǔ)句之后!。

也可以在更多外部try塊中嵌套try-catch塊。在這些情況下,我們有一個(gè)內(nèi)部catch塊將異常轉(zhuǎn)發(fā)到外部級(jí)別的可能性。這是用表達(dá)式拋出,沒有參數(shù)。例如:

try { try { // code here } catch (int n) { throw; }}catch (...) { cout << "Exception occurred";}

Exception specification

舊代碼可能包含動(dòng)態(tài)異常規(guī)范。他們現(xiàn)在在C++不提倡的,但還是支持。一個(gè)動(dòng)態(tài)的異常說明如下一個(gè)函數(shù)聲明,添加一個(gè)throw 說明符。例如:

double myfunction (char param) throw (int);

這里聲明一個(gè)函數(shù)MyFunction,它帶有一個(gè)char類型參數(shù)和返回一個(gè)double類型的值。如果函數(shù)拋出一些類型不是int,函數(shù)調(diào)用 std::unexpected 而不是尋找一個(gè)處理程序或調(diào)用std::terminate

如果throw說明符是空的類型,這意味著std::unexpected 是被其他外部調(diào)用。沒有throw說明符函數(shù)(的正常功能)不調(diào)用std::unexpected ,但按照正常的路徑尋找自己的異常處理程序。

int myfunction (int param) throw(); // all exceptions call unexpectedint myfunction (int param); // normal exception handling

標(biāo)準(zhǔn)異常(Standard exceptions)

C++標(biāo)準(zhǔn)庫(kù)提供了一個(gè)基類用于對(duì)象被拋出的異常。它被稱為std::exception,并在頭文件中定義。這個(gè)類有一個(gè)虛成員函數(shù)叫what ,返回一個(gè)空終止字符序列(類型為char *),可以覆蓋在派生類中含有某種異常的描述。

// using standard exceptions#include <iostream>#include <exception>using namespace std;class myexception: public exception{ virtual const char* what() const throw() { return "My exception happened"; }} myex;int main () { try { throw myex; } catch (exception& e) { cout << e.what() << '/n'; } return 0;}

我們放了一個(gè)捕獲異常對(duì)象的引用(在類型符通知)處理程序,因此這個(gè)catch也是exception的派生類,比如myex對(duì)象是myexception對(duì)象類型。

通過對(duì)C++標(biāo)準(zhǔn)庫(kù)異常類拋出異常來自這部分拋出的異常。這些是: 這里寫圖片描述 也從exception派生,頭文件定義了兩個(gè)泛型異常類型,這些異常類型可以由自定義異常繼承來報(bào)告錯(cuò)誤: 這里寫圖片描述

需要檢查的標(biāo)準(zhǔn)異常的一個(gè)典型例子是內(nèi)存分配:

// bad_alloc standard exception#include <iostream>#include <exception>using namespace std;int main () { try { int* myarray= new int[1000]; } catch (exception& e) { cout << "Standard exception: " << e.what() << endl; } return 0;}

通過本例中的異常處理程序捕獲是一個(gè)bad_alloc。因?yàn)閎ad_alloc來自標(biāo)準(zhǔn)庫(kù)類exception,它能被捕捉到(捕捉參考,捕捉所有相關(guān)的類)。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 吴旗县| 裕民县| 晋江市| 萨迦县| 正安县| 吉林市| 宾川县| 静宁县| 扬中市| 八宿县| 新邵县| 兴安县| 遵义县| 文成县| 瑞丽市| 涡阳县| 买车| 合江县| 钟祥市| 财经| 东明县| 三门县| 凤冈县| 阿勒泰市| 上林县| 仁化县| 裕民县| 安康市| 新绛县| 永修县| 新闻| 皮山县| 县级市| 綦江县| 衡阳市| 象山县| 武城县| 定远县| 平湖市| 左权县| 淮北市|