精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

十點詳解C++異常處理 一文助你全面剖析C++異常處理機制

開發 后端
在C語言的世界中,對錯誤的處理總是圍繞著兩種方法:一是使用整型的返回值標識錯誤;二是使用errno宏(可以簡單地理解為一個全局整型變量)去記錄錯誤。當然C++中仍然是可以用這兩種方法的。

[[389466]]

一,什么是異常處理

一句話:異常處理就是處理程序中的錯誤,比如嘗試除以零的操作。

二,為什么需要異常,以及異常處理的基本思想

C++之父Bjarne Stroustrup在《The C++ Programming Language》中講到:一個庫的作者可以檢測出發生了運行時錯誤,但一般不知道怎樣去處理它們(因為和用戶具體的應用有關);另一方面,庫的用戶知道怎樣處理這些錯誤,但卻無法檢查它們何時發生(如果能檢測,就可以在用戶的代碼里處理了,不用留給庫去發現)。

Bjarne Stroustrup說:提供異常的基本目的就是為了處理上面的問題。基本思想是:讓一個函數在發現了自己無法處理的錯誤時拋出(throw)一個異常,然后它的(直接或者間接)調用者能夠處理這個問題。

也就是《C++ primer》中說的:將問題檢測和問題處理相分離。

一種思想:在所有支持異常處理的編程語言中,要認識到的一個思想:在異常處理過程中,由問題檢測代碼可以拋出一個對象給問題處理代碼,通過這個對象的類型和內容,實際上完成了兩個部分的通信,通信的內容是“出現了什么錯誤”。當然,各種語言對異常的具體實現有著或多或少的區別,但是這個通信的思想是不變的。

三,異常出現之前處理錯誤的方式

在C語言的世界中,對錯誤的處理總是圍繞著兩種方法:一是使用整型的返回值標識錯誤;二是使用errno宏(可以簡單地理解為一個全局整型變量)去記錄錯誤。當然C++中仍然是可以用這兩種方法的。

這兩種方法最大的缺陷就是會出現不一致問題。例如有些函數返回1表示成功,返回0表示出錯;而有些函數返回0表示成功,返回非0表示出錯。

還有一個缺點就是函數的返回值只有一個,你通過函數的返回值表示錯誤代碼,那么函數就不能返回其他的值。當然,你也可以通過指針或者C++的引用來返回另外的值,但是這樣可能會令你的程序略微晦澀難懂。

四,異常為什么好

優點有以下幾點:

1. 函數的返回值可以忽略,但異常不可忽略。如果程序出現異常,但是沒有被捕獲,程序就會終止,這多少會促使程序員開發出來的程序更健壯一點。而如果使用C語言的error宏或者函數返回值,調用者都有可能忘記檢查,從而沒有對錯誤進行處理,結果造成程序莫名其面的終止或出現錯誤的結果。

2. 整型返回值沒有任何語義信息。而異常卻包含語義信息,有時你從類名就能夠體現出來。

3. 整型返回值缺乏相關的上下文信息。異常作為一個類,可以擁有自己的成員,這些成員就可以傳遞足夠的信息。

異常處理可以在調用跳級。這是一個代碼編寫時的問題:假設在有多個函數的調用棧中出現了某個錯誤,使用整型返回碼要求你在每一級函數中都要進行處理。而使用異常處理的棧展開機制,只需要在一處進行處理就可以了,不需要每級函數都處理。

五, C++中使用異常時應注意的問題

任何事情都是兩面性的,異常有好處就有壞處。如果在你的代碼中使用異常,那么需要注意以下事項:

1. 性能問題。這個一般不會成為瓶頸,但是如果你編寫的是高性能或者實時性要求比較強的軟件,就需要考慮了。

2. 指針和動態分配導致的內存回收問題:動態內存不會自動回收,如果遇到異常就需要考慮是否正確地回收了內存。

函數的異常拋出列表:如果沒有寫noexcept,意味著你可以拋出任何異常。

六,異常基本語法

很簡單,拋出一場用throw,捕獲用try...catch

  • throw: 當問題出現時,程序會拋出一個異常。
  • catch: 在您想要處理問題的地方,通過異常處理程序捕獲異常。
  • try: try 塊中的代碼標識將被激活得特定異常。它后面通常跟著一個或多個 catch 塊。
  • noexcept:用于聲明函數不拋出異常,如果函數拋了異常,則直接中斷,不能被捕獲

使用 try...catch 語句的語法如下所示:

  1. try 
  2.    // 保護代碼 
  3. }catch( ExceptionName e1 ) 
  4.    // catch 塊 
  5. }catch( ExceptionName e2 ) 
  6.    // catch 塊 
  7. }catch( ExceptionName eN ) 
  8.    // catch 塊 

 如果 try 塊在不同的情境下會拋出不同的異常,這個時候可以嘗試羅列多個 catch 語句,用于捕獲不同類型的異常

捕獲異常時的注意事項:

  1. catch的匹配過程是找最先匹配的,不是最佳匹配。
  2. catch的匹配過程中,對類型的要求比較嚴格。不允許標準算術轉換和類類型的轉換。(類類型的轉化包括兩種:通過構造函數的隱式類型轉化和通過轉化操作符的類型轉化)。

七,異常之棧解旋

異常被拋出后,從進入try塊起,到異常被拋擲前,這期間在棧上構造的所有對象,都會被自動析構。

析構的順序與構造的順序相反,這一過程稱為棧的解旋(unwinding).

  1. struct Maker 
  2.     Maker() 
  3.     { 
  4.         cout << "Maker() 構造函數" << endl; 
  5.     } 
  6.     Maker(const Maker& other) 
  7.     { 
  8.         cout << "Maker(Maker&) 拷貝構造函數" << endl; 
  9.     } 
  10.     ~Maker() 
  11.     { 
  12.         cout << "~Maker() 析構函數" << endl; 
  13.     } 
  14. }; 
  15. void fun() 
  16.     Maker m; 
  17.     cout << "--------" << endl; 
  18.     throw m; 
  19.     cout << "fun__end" << endl; 
  20. int main() 
  21.     try 
  22.     { 
  23.         fun(); 
  24.     } 
  25.     catch (Maker & m) 
  26.     { 
  27.         cout << "收到Maker異常" << endl; 
  28.     } 

 八,C++ 標準的異常

C++ 提供了一系列標準的異常,定義在 中,我們可以在程序中使用這些標準的異常。它們是以父子類層次結構組織起來的,如下所示:


每個類所在的頭文件在圖下方標識出來

標準異常類的成員: ① 在上述繼承體系中,每個類都有提供了構造函數、復制構造函數、和賦值操作符重載。 ② logic_error類及其子類、runtime_error類及其子類,它們的構造函數是接受一個string類型的形式參數,用于異常信息的描述; ③ 所有的異常類都有一個what()方法,返回const char* 類型(C風格字符串)的值,描述異常信息。

下表是對上面層次結構中出現的每個異常的說明:

九、編寫自己的異常類

  • 為什么要編寫自己的異常類? ① 標準庫中的異常是有限的; ② 在自己的異常類中,可以添加自己的信息。(標準庫中的異常類值允許設置一個用來描述異常的字符串)。
  • 如何編寫自己的異常類? ① 建議自己的異常類要繼承標準異常類。因為C++中可以拋出任何類型的異常,所以我們的異常類可以不繼承自標準異常,但是這樣可能會導致程序混亂,尤其是當我們多人協同開發時。 ② 當繼承標準異常類時,應該重載父類的what函數和虛析構函數。 ③ 因為棧展開的過程中,要復制異常類型,那么要根據你在類中添加的成員考慮是否提供自己的復制構造函數。

示例:

  1. #include <iostream> 
  2. #include <exception> 
  3. using namespace std; 
  4.  //第一種 
  5. class Out_Range : public exception 
  6. public
  7.     explicit Out_Range(const string& _Message) : exception(_Message.c_str()) {} 
  8.     explicit Out_Range(const char* _Message) : exception(_Message) {} 
  9. }; 
  10. //第二種 
  11. struct Exce :public exception 
  12.     const char* what() const override 
  13.     { 
  14.         return "Exce"
  15.     } 
  16. }; 
  17.   
  18. void foo(int arr[], int len) 
  19.     int i = -1; 
  20.     if (i<0 || i>=len) 
  21.     { 
  22.         throw Out_Range("數組越界啦~"); 
  23.     } 
  24.     cout << arr[i] << endl; 
  25.  
  26. int main() 
  27.     int arr[3] = { 0 }; 
  28.     try 
  29.     { 
  30.         foo(arr, 3); 
  31.     } 
  32.     catch (Out_Range& e)        //自定義錯誤 
  33.     { 
  34.         cout << "Out_Range& e   " << e.what() << endl; 
  35.     } 
  36.     catch (std::exception& e)   //其他錯誤 
  37.     { 
  38.         cout <<"std::exception& e   "<<e.what()<< endl; 
  39.     } 
  40.     return 0; 

 十,來自C++之父Bjarne Stroustrup的建議

節選自《The C++ Programming Language》 ——C++之父Bjarne Stroustrup

1. 當局部的控制能夠處理時,不要使用異常;

2.使用“資源分配即初始化”技術去管理資源;

3. 盡量少用try-catch語句塊,而是使用“資源分配即初始化”技術。

4. 如果構造函數內發生錯誤,通過拋出異常來指明。

5. 避免在析構函數中拋出異常。

6. 保持普通程序代碼和異常處理代碼分開。

7. 小心通過new分配的內存在發生異常時,可能造成內存泄露。

8. 如果一個函數可能拋出某種異常,那么我們調用它時,就要假定它一定會拋出該異常,即要進行處理。

9. 要記住,不是所有的異常都繼承自exception類。

10. 編寫的供別人調用的程序庫,不應該結束程序,而應該通過拋出異常,讓調用者決定如何處理(因為調用者必須要處理拋出的異常)。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2015-12-28 11:25:51

C++異常處理機制

2011-03-17 09:20:05

異常處理機制

2010-01-27 15:36:54

C++異常處理

2009-08-05 18:09:17

C#異常處理機制

2011-04-06 10:27:46

Java異常處理

2010-01-27 15:29:45

C++異常處理

2010-02-02 11:16:28

C++異常

2010-01-13 13:42:55

C++編譯器

2010-03-05 15:40:16

Python異常

2009-08-31 17:26:32

C#異常處理

2024-02-27 10:48:16

C++代碼開發

2010-01-27 16:39:48

C++編譯器

2011-08-19 15:05:29

異常處理

2023-11-13 17:01:26

C++編程

2011-07-21 15:20:41

java異常處理機制

2023-06-15 14:09:00

解析器Servlet容器

2010-01-22 18:33:17

C++編譯器

2024-01-22 13:05:00

C++編程異常處理

2021-07-03 17:53:52

Java異常處理機制

2024-03-04 10:00:35

數據庫處理機制
點贊
收藏

51CTO技術棧公眾號

午夜小视频免费| 欧美精品久久久久久久久46p| 久久男人av资源站| 久久久青草青青国产亚洲免观| 国产精品成人aaaaa网站| a资源在线观看| 高潮久久久久久久久久久久久久| 日韩欧美精品免费在线| 欧美一级黄色录像片| 亚洲欧美日本在线观看| 久久国产免费看| 97视频免费观看| 亚洲人与黑人屁股眼交| 极品束缚调教一区二区网站| 欧美视频在线一区| 青青青青草视频| 免费黄色在线| 久久亚洲精华国产精华液| 亚洲一区二区久久久久久久| 精品不卡一区二区| 国内视频精品| 久久久精品一区二区三区| 国产精品亚洲无码| www.神马久久| 91麻豆精品国产自产在线| 可以在线看的黄色网址| 日本三级韩国三级欧美三级| 中文字幕 久热精品 视频在线 | 免费成人深夜夜行网站视频| 深夜福利视频在线观看| 国产成人精品影院| 国产综合久久久久久| 午夜精品免费观看| 亚洲一区日本| 97婷婷涩涩精品一区| 男女羞羞免费视频| 一个色综合网| 日韩在线视频导航| 免费看黄色三级| 国产成人三级| 亚洲人成在线观看网站高清| 国产精品嫩草av| 国产精品天天看天天狠| 日韩一卡二卡三卡| 亚洲自拍第三页| 亚洲精品毛片| 欧美日韩成人高清| 色播五月综合网| 成人在线高清| 欧美色视频在线观看| 日本熟妇人妻xxxxx| 亚洲永久av| 在线视频你懂得一区二区三区| av免费播放网址| 性欧美18xxxhd| 欧美日韩亚洲一区二| 黄色av网址在线播放| 国产乱码午夜在线视频| 午夜精品福利一区二区三区av| www.av蜜桃| 国产高清在线a视频大全 | 国产传媒一区在线| 999国产视频| 欧美特黄一级视频| 91在线小视频| 欧美视频观看一区| 91亚洲欧美| 国产精品福利在线播放| 先锋影音男人资源| 美女91在线| 欧美日韩午夜激情| 免费av网址在线| xxxxx.日韩| 91麻豆精品国产综合久久久久久 | 亚洲视频在线看| 日本一二三不卡视频| 91精品啪在线观看国产18| 欧美精品情趣视频| 日本三级片在线观看| 国产人成精品一区二区三| 国产a级全部精品| 亚洲一线在线观看| 国产成人aaa| 女人一区二区三区| 久久综合网导航| 婷婷成人激情在线网| www.99在线| 日本一区二区三区视频在线看| 亚洲电影天堂av| 手机毛片在线观看| 欧美日韩亚洲三区| 国产成人高潮免费观看精品| 91久久国语露脸精品国产高跟| 国产大陆精品国产| 午夜精品一区二区三区在线观看 | 91日韩精品视频| 国内精品国产成人国产三级粉色| 国产亚洲精品久久久久久| 亚洲最大的黄色网址| 一区二区三区精品视频在线观看| 国产精品老女人视频| 亚洲精品字幕在线观看| 国产日产欧美一区二区视频| 最新av网址在线观看| 日韩高清在线| 亚洲国产精品成人精品| 亚洲人做受高潮| 蘑菇福利视频一区播放| 91香蕉亚洲精品| 激情小视频在线观看| 亚洲最大色网站| 男人插女人下面免费视频| 超碰成人在线观看| 久久精品国产亚洲精品2020| 台湾佬中文在线| 成人午夜免费视频| 亚洲第一精品区| 桃花岛tv亚洲品质| 亚洲电影免费观看高清完整版在线观看| 国产精品理论在线| 久久亚洲不卡| 精品国产一区二区三| 在线网址91| 欧美理论片在线| 在线观看免费小视频| 国产精品丝袜xxxxxxx| 99久久无色码| 国产在线一区二区视频| 欧美在线色视频| 97超碰在线资源| 在线日韩视频| 国产精品久久亚洲| 直接在线观看的三级网址| 欧美群妇大交群中文字幕| av手机在线播放| 日韩一区精品字幕| 欧美日韩一区综合| 在线中文字幕播放| 日韩av在线高清| 国产午夜小视频| 丁香桃色午夜亚洲一区二区三区| 丰满人妻一区二区三区53号| 国产精品一区免费在线 | 欧美一区少妇| 成人美女黄网站| 亚洲精品一二区| 亚洲va在线观看| 国产欧美日韩亚州综合 | 国产成人综合亚洲91猫咪| 综合久久国产| 国产成年精品| 欧美精品免费在线观看| 精品人妻久久久久一区二区三区 | 极品美女扒开粉嫩小泬| 久久亚洲黄色| 45www国产精品网站| 青青视频在线观| 91成人免费电影| 99在线视频免费| 激情久久五月天| 51xx午夜影福利| 亚洲精品一区二区三区在线| 欧美激情在线一区| 人妻精品一区一区三区蜜桃91| 午夜伊人狠狠久久| 丰满圆润老女人hd| 蜜臀av性久久久久蜜臀av麻豆| 亚洲欧美国产一区二区| 成人污污www网站免费丝瓜| 欧美老女人性视频| 午夜18视频在线观看| 色播五月激情综合网| 日韩av片在线免费观看| 国产大陆a不卡| 欧美视频在线播放一区| 不卡视频在线| 成人片在线免费看| 都市激情亚洲综合| 最近更新的2019中文字幕| 国产强伦人妻毛片| 亚洲va欧美va人人爽| 91久久免费视频| 久草在线在线精品观看| av无码久久久久久不卡网站| 国产成人1区| 亚洲japanese制服美女| 高清精品在线| 中文字幕日韩综合av| 午夜精品在线播放| 色噜噜狠狠成人中文综合| 神马午夜精品91| 26uuu另类欧美亚洲曰本| 波多野结衣xxxx| 一区精品久久| 亚洲精品一区二| 久久久久久久久久久久久久久久久久久久| 清纯唯美日韩制服另类| caopon在线免费视频| 亚洲精品视频在线观看视频| 国产chinasex对白videos麻豆| 欧美三级欧美成人高清www| 婷婷伊人五月天| 国产三级精品视频| 日本三级日本三级日本三级极| 久久er99热精品一区二区| 久久综合色视频| 综合天堂av久久久久久久| 日韩av大全| 精品国产午夜肉伦伦影院| 成人激情av在线| 吉吉日韩欧美| 久久久伊人欧美| aaa大片在线观看| 综合136福利视频在线| av女名字大全列表| 精品国产免费一区二区三区香蕉 | 水蜜桃在线视频| 欧美成人免费小视频| 成年人在线视频| 亚洲欧美国产精品| 全国男人的天堂网| 日韩视频一区二区在线观看| 国产精品第6页| 第一福利永久视频精品| 国产精品99精品无码视| 亚洲男同性恋视频| 中文字幕观看av| 国产精品久久久久四虎| 一级黄色片网址| 久久久不卡网国产精品一区| 亚洲一级Av无码毛片久久精品| 国产一区高清在线| 中文字幕66页| 极品少妇一区二区三区精品视频| 人妻无码视频一区二区三区| 美女网站久久| 免费成人在线视频网站| 国产亚洲综合精品| 伊人成色综合网| 国产精品永久| 波多野结衣家庭教师视频| av成人黄色| 欧美a在线视频| 免费永久网站黄欧美| 精品这里只有精品| 亚洲伦理一区| 国产一级爱c视频| 亚洲伊人观看| 日本三区在线观看| 日韩电影免费在线看| 邪恶网站在线观看| 麻豆久久久久久久| 国产福利精品一区二区三区| 国产尤物一区二区| 中文字幕第六页| 风间由美性色一区二区三区 | 老牛精品亚洲成av人片| 精品久久久久久一区二区里番| 国语一区二区三区| 久久久久se| 欧美日韩伦理| japanese在线视频| 国产精品啊啊啊| 大j8黑人w巨大888a片| 久久久久久亚洲精品杨幂换脸| 日韩一级片播放| 国产呦萝稀缺另类资源| 先锋资源av在线| 久久久国产一区二区三区四区小说| 91资源在线播放| 亚洲男人天堂av| 欧美不卡视频在线观看| 在线免费观看日本欧美| 国产精品无码久久av| 精品美女在线观看| 国产在线观看网站| 久久精品亚洲热| а√天堂8资源中文在线| 奇米一区二区三区四区久久| 高清亚洲高清| 国产成人亚洲欧美| 国产精品欧美日韩一区| 超碰人人爱人人| 新狼窝色av性久久久久久| 日韩爱爱小视频| 成人久久18免费网站麻豆| 久久久久久久久久久久久久久| 亚洲素人一区二区| 国产婷婷色一区二区在线观看| 欧美日韩精品系列| 天堂在线观看视频| 日韩在线视频免费观看| 蜜桃视频在线观看播放| 国产日韩欧美自拍| 日韩电影不卡一区| 成年人黄色在线观看| 亚洲尤物精选| 亚洲综合在线一区二区| 久久久久久久久99精品| 欧美片一区二区| 欧美日韩中文字幕一区| 日本激情一区二区| 久久精品久久久久电影| 美女扒开腿让男人桶爽久久软| 成人黄色短视频在线观看| 日韩成人av在线资源| 先锋影音男人资源| 免费成人美女在线观看| 亚洲中文字幕一区| 一区二区三区中文在线观看| 日韩av免费播放| 亚洲精品国产美女| 在线观看免费视频你懂的| 国产精品女主播| 亚洲激情77| 天堂…中文在线最新版在线| 国产一区二区在线视频| 手机看片福利视频| 狠狠爱在线视频一区| 亚洲高清视频网站| 久久韩剧网电视剧| 欧美日韩尤物久久| 欧美日韩亚洲在线| 亚洲欧洲午夜| 天天躁日日躁狠狠躁免费麻豆| 中文字幕一区二区视频| 国产免费a视频| 亚洲免费福利视频| 国产传媒av在线| 国产另类第一区| 1024日韩| 99久久免费看精品国产一区| 亚洲福利一区二区三区| 亚洲第九十九页| 欧美疯狂做受xxxx高潮| 99久久久国产| 最新av在线免费观看| 激情小说亚洲一区| 欧美h片在线观看| 欧美日本韩国一区二区三区视频| www.亚洲免费| 成人国产精品久久久久久亚洲| 欧美日韩一区二区三区视频播放| 国产日韩一区二区在线观看| aaa欧美日韩| 男人的天堂一区二区| 日韩成人在线电影网| 天堂√中文最新版在线| 日本一区二区三区www| 人禽交欧美网站| 蜜桃av免费在线观看| 欧美久久婷婷综合色| 成年人黄视频在线观看| 91成人免费视频| 国产精品a级| 欧美夫妇交换xxx| 欧美午夜女人视频在线| 国产裸舞福利在线视频合集| 国产精品视频免费观看www| 久久国产影院| 亚洲AV无码久久精品国产一区| 亚洲影视在线播放| 性xxxx视频| 国产福利精品视频| 99精品小视频| 欧洲成人午夜精品无码区久久| 图片区小说区区亚洲影院| 欧美精品少妇| 成人xxxxx| 亚洲三级影院| 色哟哟精品观看| 777奇米四色成人影色区| 欧美精品videosex| 蜜桃日韩视频| 久久99久久99小草精品免视看| 日本aⅴ在线观看| 精品视频久久久久久久| 国产成人精品一区二区三区视频| 国产成人免费高清视频| 不卡的av在线| 中文字幕你懂的| 欧美高清无遮挡| 激情五月综合| 第一页在线视频| 在线一区二区三区做爰视频网站| 久久99精品久久久久久野外| 国产精品一区二区在线观看| 日韩精品一级中文字幕精品视频免费观看| 日本在线一级片| 亚洲精品资源美女情侣酒店| 24小时成人在线视频| 免费成人在线视频网站| 椎名由奈av一区二区三区| 香蕉久久国产av一区二区| 成人福利视频在线观看| 国产精品入口| 欧美国产在线看| 中文字幕不卡av| 免费萌白酱国产一区二区三区| 怡红院亚洲色图|