【C++基础】异常匹配与内建异常类
目錄
- 異常匹配
- catch: 按異常類型匹配
- 為何要使用異常類
- 內(nèi)建異常類
- 標(biāo)準(zhǔn)庫(kù)中的異?;?/li>
- 標(biāo)準(zhǔn)庫(kù)中的異常類
- 例1:vector下標(biāo)訪問越界out_of_range異常
- 例2:內(nèi)存分配失敗bad_alloc異常
- 例3:側(cè)向轉(zhuǎn)換失敗bad_cast異常類
- 幾種情況,使用對(duì)應(yīng)異常
異常匹配
catch: 按異常類型匹配
已知try是監(jiān)視可能出現(xiàn)問題的代碼,throw是扔出問題,catch是看扔出的問題是否和它的類型匹配,如果是匹配那么就抓住問題進(jìn)行處理。
這里的類型使用傳引用,避免拷貝浪費(fèi)。
若try{}中所拋異常類型與catch()的參數(shù)類型(ExceptionType)匹配,則進(jìn)入catch塊
若對(duì)異常對(duì)象的內(nèi)容不感興趣,可省略catch參數(shù),只保留類型。
如:
舉例:
f1()拋出整型異常。
f2()是要申請(qǐng)28G內(nèi)存,如果電腦內(nèi)存不夠,執(zhí)行代碼會(huì)出錯(cuò),拋出bad_alloc異常。這是C++規(guī)定的,new出現(xiàn)問題就會(huì)拋出bad_alloc異常。bad_alloc是C++異常類exception基類的派生類。
對(duì)于f1的兩種處理:
try { f1(); } catch (int) { //僅有類型cout << "Error" << endl; }try { f1(); } catch (int& e) { //類型+參數(shù)cout << e << endl; }對(duì)于f2的兩種處理:
注意e.what()是exception類內(nèi)部的一個(gè)虛函數(shù),返回的是一個(gè)指針,指向一個(gè)字符串,包含了異常的解釋信息。
為何要使用異常類
整數(shù)作為異常類型,只能獲取整數(shù)的信息。
不使用異常類,則捕獲的異常所能傳遞的信息量很少。
使用異常類,則可以在拋出異常時(shí)傳遞很多信息,在捕獲異常時(shí)接收這些信息。
class Beautiful {string name;string hometown;int salary;string misdoing; // ………… } try {// ... } catch (Beautiful object) {//do something with object }內(nèi)建異常類
標(biāo)準(zhǔn)庫(kù)中的異常基類
exception 是標(biāo)準(zhǔn)庫(kù)所有異常類的基類
使用異常類需要包括頭文件 #include <exception>
class exception需要注意的部分如下:
exception(); // 構(gòu)造函數(shù)
virtual const char* what(); //返回解釋性字符串
what()返回的指針指向擁有解釋信息的空終止字符串的指針。該指針保證在獲取它的異常對(duì)象被銷毀前,或在調(diào)用該異常對(duì)象的非靜態(tài)成員函數(shù)前合法
標(biāo)準(zhǔn)庫(kù)中的異常類
在使用所有標(biāo)準(zhǔn)庫(kù)異常類的時(shí)候,都必須附加std名字空間。
runtime_error與logic_error的使用區(qū)別
來(lái)自wiki的解釋:
邏輯錯(cuò)誤:(有時(shí)稱為語(yǔ)義錯(cuò)誤)是程序中的一個(gè)錯(cuò)誤,它會(huì)導(dǎo)致程序錯(cuò)誤運(yùn)行,但不會(huì)異常終止(或崩潰)。邏輯錯(cuò)誤會(huì)產(chǎn)生非預(yù)期或不希望的輸出或其他行為,盡管它可能不會(huì)立即被識(shí)別。
編譯語(yǔ)言和解釋語(yǔ)言都會(huì)出現(xiàn)邏輯錯(cuò)誤。與有語(yǔ)法錯(cuò)誤的程序不同,有邏輯錯(cuò)誤的程序在語(yǔ)言中是有效的程序,盡管它的行為不符合預(yù)期。
運(yùn)行時(shí)錯(cuò)誤:一個(gè)錯(cuò)誤在程序執(zhí)行過程中發(fā)生的。相反,編譯時(shí)錯(cuò)誤發(fā)生在程序編譯時(shí)。運(yùn)行時(shí)錯(cuò)誤表示程序中的錯(cuò)誤或設(shè)計(jì)人員預(yù)期的問題,但卻無(wú)能為力。例如,內(nèi)存不足通常會(huì)導(dǎo)致運(yùn)行時(shí)錯(cuò)誤。
例1:vector下標(biāo)訪問越界out_of_range異常
vector有許多種訪問元素的方式,其中[]下標(biāo)訪問不會(huì)做越界檢查,at()會(huì)做越界檢查。
我們將它截獲
例2:內(nèi)存分配失敗bad_alloc異常
#include<iostream> using namespace std; int main() {for( int i = 0; i < 10000; i++){auto *p = new long long int [70000];cout << i << "array" << endl;}return 0; }
進(jìn)行捕獲
程序正常退出。
例3:側(cè)向轉(zhuǎn)換失敗bad_cast異常類
創(chuàng)建基類student
創(chuàng)建派生類Undergraduate和Graduate
主函數(shù)中用dynamic_cast 將Undergraduate類型轉(zhuǎn)換為Graduate類型.
dynamic_cast只有在做引用類型轉(zhuǎn)換時(shí)候轉(zhuǎn)換失敗才會(huì)拋出異常。使用指針類型時(shí),如果轉(zhuǎn)換失敗會(huì)返回nullptr
幾種情況,使用對(duì)應(yīng)異常
1、除法運(yùn)算中除數(shù)為0;
:invalid_argument
2、在只讀文件系統(tǒng)中以寫模式打開一個(gè)文件流;
:filesystem::filesystem_error
3、 數(shù)組a的容量為5,向 a[5] 中寫入數(shù)據(jù);
:out_of_range
4、用 new 申請(qǐng)內(nèi)存失敗;
:bad_array_new_length
5、將A指針類型轉(zhuǎn)換為B指針類型失敗;
:bad_any_cast
6、將 1234567 這個(gè)整數(shù)存到一個(gè) short int 類型的變量中(在32位C++編譯器中編譯)
:length_error
總結(jié)
以上是生活随笔為你收集整理的【C++基础】异常匹配与内建异常类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 海信75E5G可以看直播吗
- 下一篇: C++中比较两个浮点数是否相等