日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

【C++基础】异常匹配与内建异常类

發(fā)布時(shí)間:2023/12/1 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++基础】异常匹配与内建异常类 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 異常匹配
    • 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)。

catch ( ExceptionType& parameter ) { /* 處理異常 */ }

若try{}中所拋異常類型與catch()的參數(shù)類型(ExceptionType)匹配,則進(jìn)入catch塊
若對(duì)異常對(duì)象的內(nèi)容不感興趣,可省略catch參數(shù),只保留類型。
如:

catch ( ExceptionType& ) { /* 處理異常 */ }

舉例:
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基類的派生類。

void f1() { throw 100; } void f2() { for (int i = 1; i <= 100; i++) new int[70000000]; }

對(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è)字符串,包含了異常的解釋信息。

try { f2(); } catch (bad_alloc) {cout << "new failed" << endl; } try { f2(); } catch (bad_alloc &e) {cout << "Exception: " << e.what() << endl; }

為何要使用異常類

整數(shù)作為異常類型,只能獲取整數(shù)的信息。
不使用異常類,則捕獲的異常所能傳遞的信息量很少。

try {// ... } catch (int e) {//do something with e }

使用異常類,則可以在拋出異常時(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)行捕獲

#include<iostream> #include <exception> #include <stdexcept> #include <new> using namespace std; int main() {try {for (int i = 0; i < 10000; i++){auto* p = new long long int[70000];cout << i << "array" << endl;}}catch (bad_alloc& e){cout << "exception " << e.what() << endl;}return 0; }

程序正常退出。

例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

#include <iostream> #include <exception> #include <stdexcept>using namespace std;class Student { public:Student() = default;virtual void foo() {}; }; class Undergraduate : public Student {}; class Graduate : public Student {}; int main() {Undergraduate u;Graduate g;Student *s1 = &u;Student *s2 = &g;//正常操作,p指針不為nullptrGraduate *p = dynamic_cast<Graduate *>(s2);//轉(zhuǎn)化不成功,p2指針為nullptrGraduate *p2 = dynamic_cast<Graduate *>(s1);if(p2 == nullptr){cout << "cast s1 to Graduate* failed " << endl;}else{cout << "cast s1 to Graduate* succeeded " << endl;}//引用,拋異常try{Graduate &r1 = dynamic_cast<Graduate &> (u);}catch (bad_cast & e){cout << "Exception: " << e.what() << endl;}return 0; }

幾種情況,使用對(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

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的【C++基础】异常匹配与内建异常类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。